是什么让以下代码打印错误?

时间:2010-01-06 10:55:47

标签: java puzzle

public class Guess {
    public static void main(String[] args){
        <sometype> x = <somevalue>;
        System.out.println(x == x);
    }
}

我必须更改sometype和somevalue以使其返回false?有可能吗?

4 个答案:

答案 0 :(得分:15)

一:

float x = Float.NaN; 

二:

double x = 0.0/0.0;

为什么?

正如此处所述,NaN永远不会与另一个NaN相等 - 请参阅http://java.sun.com/docs/books/jls/second_edition/html/typesValues.doc.html


那为什么这不会返回false?

Float x = Float.NaN; 

答案是,这里有一个引用赋值,而不是原始赋值。并且在后台有一个小自动拳击。这等于:

Float x = new Float(Float.NaN); 

等于:

Float x = new Float(0.0f / 0.0f); 

这里x是对Float对象的引用,==运算符测试引用相等,而不是值。

要看到这个返回false,测试应该是:

x.doubleValue()==x.doubleValue();

确实会返回false

答案 1 :(得分:3)

是的,有可能,您需要使用:

// Edited for primitives :)
float x = Float.NaN;
// or
double x = Double.NaN;

这是因为NaN是一个与自身不相同的特殊情况。

来自JLS(4.2.3):

  

NaN是无序的,因此如果其中一个或两个操作数都是NaN(§15.20.1),则数值比较运算符&lt;,&lt; =,&gt;和&gt; =返回false。如果任一操作数是NaN,则等于运算符==返回false,如果任一操作数是NaN(第15.21.1节),则不等式运算符!=返回true。特别是,当且仅当x是NaN时,x!= x才为真,如果x或y是NaN,则(x = y)将为假。

答案 2 :(得分:0)

我无法想到任何someTypesomeValue您可能会x == x出现错误,抱歉。


<强>更新

哦......是的,我认为NAN等于没有,甚至本身。所以......

doubleDouble.NaN(或左右)。

答案 3 :(得分:0)

这将打印false:

!(x == x)

除此之外,如果您使用NaN

,它只会打印为false
float x = float.NaN;
Console.WriteLine(x == x);