当前位置:  开发笔记 > 编程语言 > 正文

怎么能"while(i == i);" 在单线程应用程序中是一个非无限循环?

如何解决《怎么能"while(i==i);"在单线程应用程序中是一个非无限循环?》经验,为你挑选了6个好方法。

我刚才有一个我无法回答的问题.

假设您在Java中使用此循环定义:

while (i == i) ;

如果循环不是无限循环并且程序只使用一个线程i,i那么类型和值什么?



1> Zach Scriven..:
double i = Double.NaN;

Double.equals()的API解释了答案:"Double.NaN == Double.NaN的值为false".这在Java语言规范" 浮点类型,格式和值 "下详细说明:

NaN是无序的,所以数值比较运算<,<=,>,和>= 返回false如果任一或两个操作数都NaN.等于运算符==将返回false如果操作数是NaN和不平等操作!=返回true如果操作数是NaN.尤其x!=xtrue当且仅当xNaN,和(x=y)将是false,如果xyNaN.


它在数学上是固的,为什么一个虚幻的数字与另一个相等?5/0!= sqrt(-4)
@CrazyJugglerDrummer:也许,但同样`x == x`应该永远是真的.为什么一切都不相同?
@inovaovao:不,在DB中,`null = null`为null.`NULL IS NULL`是1.

2> Filip Ekberg..:

i那么值是无效的."不是数字".

经过一些谷歌搜索,我发现你可以在Java中拥有NaN(非数字)!因此,浮点数是数据类型,值是NaN.看到这里


是的,就是这样.我的价值是Jon Skeet.

3> Bill the Liz..:
double i = Double.NaN;

NaN不等于任何东西,包括它自己.



4> Aaron Maenpa..:
float i = Float.NaN;
while(i == i) ;
System.out.println("Not infinite!");



5> okutane..:

我不确定,但我相信(i == i)在多线程进程中不是原子操作,所以如果我的值会被其他线程在推送它的值之间改变,在执行循环的线程上堆栈,那么那个条件可以是假的.



6> Bart van Heu..:

由于其他人说它是NaN,我对官方(JDK 6)的实施感到好奇Double.isNaN,并且看到:

/**
 * Returns true if the specified number is a
 * Not-a-Number (NaN) value, false otherwise.
 *
 * @param   v   the value to be tested.
 * @return  true if the value of the argument is NaN;
 *          false otherwise.
 */
static public boolean isNaN(double v) {
    return (v != v);
}

推荐阅读
linjiabin43
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有