首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是什么使下面的代码打印为假?

是什么使下面的代码打印为假?
EN

Stack Overflow用户
提问于 2010-01-06 18:55:47
回答 3查看 656关注 0票数 2
代码语言:javascript
复制
public class Guess {
    public static void main(String[] args){
        <sometype> x = <somevalue>;
        System.out.println(x == x);
    }
}

我必须更改某些类型和某些值,以使其返回false?有可能吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-01-06 19:04:31

其一:

代码语言:javascript
复制
float x = Float.NaN; 

二:

代码语言:javascript
复制
double x = 0.0/0.0;

为什么?

正如这里已经提到的,NaN永远不会等同于另一个NaN -请参阅http://java.sun.com/docs/books/jls/second_edition/html/typesValues.doc.html

那么为什么这不返回false呢?

代码语言:javascript
复制
Float x = Float.NaN; 

答案是,这里不是基元赋值,而是引用赋值。在后台有一个小的自动装箱。这等于:

代码语言:javascript
复制
Float x = new Float(Float.NaN); 

它等于:

代码语言:javascript
复制
Float x = new Float(0.0f / 0.0f); 

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

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

代码语言:javascript
复制
x.doubleValue()==x.doubleValue();

,则返回false。

票数 15
EN

Stack Overflow用户

发布于 2010-01-06 19:06:42

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

代码语言:javascript
复制
// Edited for primitives :)
float x = Float.NaN;
// or
double x = Double.NaN;

这是因为NaN是一个特例,它不等于它自己。

来自JLS (4.2.3):

NaN是无序的,因此如果一个或两个操作数都为NaN,则数值比较运算符<、<=、>和>=将返回false (§15.20.1)。如果任一操作数为NaN,则相等运算符==返回false;如果任一操作数为NaN,则不等式运算符!=返回true (§15.21.1)。特别地,当且仅当x为NaN时,x!=x为真,而如果x或y为NaN,则(x=y)将为假。

票数 3
EN

Stack Overflow用户

发布于 2010-01-06 19:07:06

这将打印false:

代码语言:javascript
复制
!(x == x)

除此之外,如果您使用NaN,它只会输出false

代码语言:javascript
复制
float x = float.NaN;
Console.WriteLine(x == x);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2012354

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档