怎么可以“while(i == i);”在单线程应用程序中是一个非无限循环?
我刚刚得到一个我无法回答的问题。
假设你在Java中有这个循环定义:
while (i == i) ;
如果循环不是一个无限循环, 而且程序只使用一个线程 ,那么i
的types和i
的值是什么?
double i = Double.NaN;
Double.equals()的API阐明了答案:“Double.NaN == Double.NaN的值为false”。 这在“Java语言规范”的“ 浮点types,格式和值 ”中有详细说明:
NaN
是无序的,所以如果两个操作数都是NaN
,则数字比较运算符<
,<=
,>
和>=
返回false
。 如果任一操作数是NaN
,则相等运算符==
返回false
如果任一操作数是NaN
,则不等式运算符!=
返回true
。 特别是,当且仅当x
是NaN
,x!=x
是true
,如果x
或y
是NaN
,(x<y) == !(x>=y)
将是false
。
i
的值是无效的。 “不是一个数字”。
经过一些Googlesearch之后,我发现你可以在Java中使用NaN(不是数字)! 所以,浮点数指的是数据types,数值是NaN。 看到这里
double i = Double.NaN;
NaN不等于任何东西,包括它本身。
float i = Float.NaN; while(i == i) ; System.out.println("Not infinite!");
我不知道,但我相信(i == i)不是在multithreading进程中的primefaces操作,所以如果我的价值将被改变其他线程之间的价值推动线程执行循环的堆栈之间,那么该条件可以是假的
由于其他人说这是NaN,我对Double.isNaN
的官方(JDK 6)实现感到好奇,并Double.isNaN
:
/** * Returns <code>true</code> if the specified number is a * Not-a-Number (NaN) value, <code>false</code> otherwise. * * @param v the value to be tested. * @return <code>true</code> if the value of the argument is NaN; * <code>false</code> otherwise. */ static public boolean isNaN(double v) { return (v != v); }
把南视为例外的等同物,但在计算中使用魔法值。 因为一个计算失败 – 例如一个负数的平方根,除以零等 – 它与其他任何东西比较是没有意义的。 毕竟如果除以零就是一个等于-2的平方根或-3的平方根?
Nan允许计算包括一个返回无效答案的步骤,而不会引入额外的例外情况。 为了validation答案是值,只需通过Float.isNan()o等价的方法来testing非nandness(是否这个词,如果不是我的话)。
我会补充
float i = Float.NaN;
以及
double i = Double.NaN;
在这样的问题中的一个常见的伎俩,你假设你,我是一个整数。 其他常见的假设可能是s是一个string,x,y是一个双精度,ch是一个字符,b是一个字节等等。如果你看到这样的问题,你可以打赌'我'不是它的期望types。
类似的问题是; 这永远不会循环,什么是'x'
while(x == x && x != x + 0) { }
另一个我很喜欢的问题是, 这个循环是一个无限循环,x的可能值是什么。 (:我数了十二个:)
while(x != 0 && x == -x) { }
我知道这是一个Java的问题,但考虑到其他语言的问题是有趣的。
在C语言中,如果'i'被声明为volatile(所以编译器将被强制为每个迭代执行两次'i'读取),那么一个简单的types如'int'可能会performance出“在宇宙变冷之前终止”如果“我”实际上是在其他地方可能会影响它的内存。 然后循环将会在单次迭代的两次读取之间的“i”变化时终止。 ( 增加 :一个可能的地方 – 在微型计算机里,'i'实际上位于一个I / O端口的地址,可能连接到一个位置传感器。如果'i'是一个指针variables一个指向易失性存储器的指针),声明是' while (*i == *i);
')。
正如其他答案所certificate的那样,在C ++中,如果我是用户定义的类,则可以由用户提供“==”运算符,所以任何事情都是可能的。
像NaN一样,在基于SQL的语言中,如果i的值为NULL,则循环将不会是无限的; 但是,任何非NULL值将使循环无限。 这很像Java,任何数字(与NaN相反)都会使循环无限。
我没有看到这个构造有什么实际用途,但这是一个有趣的琐事问题。
我很惊讶没有看到这个解决scheme:
while (sin(x) == sin(x)) //probably won't eval to true
在回应评论时,请试着运行这个:
double x = 10.5f; assert (x == asin(sin(x)));
x在理论上应该始终等于反正弦(sin(x)),但实际上并不是这样。
没有无限循环,一个线程:)
import static B.*; public class A { public static void main(String[] args) { System.out.println("Still Running"); while (i == i) ; } } public class B { public static int i; static { System.exit(0); } }
i == i
不是primefaces的。 通过这样的计划certificate:
static volatile boolean i = true; public static void main(String[] args) throws InterruptedException { new Thread() { @Override public void run() { while (true) { i = !i; } } }.start(); while (i == i) ; System.out.println("Not atomic! i: " + i); }
更新这里还有一个非无限循环的例子(没有创build新的线程)。
public class NoNewThreads { public static void main(String[] args) { new NoNewThreads(); System.gc(); int i = 500; System.out.println("Still Running"); while (i == i) ; } @Override protected void finalize() throws Throwable { super.finalize(); Thread.sleep(1000); System.exit(0); } }
除非i
在循环内部被改变?