C++ 为什么C编译器在a[5]==5[a]时出错

C++ 为什么C编译器在a[5]==5[a]时出错,c++,arrays,ieee-754,C++,Arrays,Ieee 754,为什么会这样 double zero = 0.0; double a[] = { 0,0,0,0,0, zero/zero}; // NaN cout << (a[5] == 5[a] ? "true" : "false") << endl; 编译器没有弄错,它与a[5]==5[a]无关zero/zero是一个无意义的表达式,因此被赋值为NaN,但NaN!=NaN,因为它可以以多种不同的方式生成 请注意,检查一下,我认为这实际上是严格未定义的行为,因为该标准实际

为什么会这样

double zero = 0.0;    
double a[] = { 0,0,0,0,0, zero/zero}; // NaN
cout << (a[5] == 5[a] ? "true" : "false") << endl;

编译器没有弄错,它与
a[5]==5[a]
无关
zero/zero
是一个无意义的表达式,因此被赋值为
NaN
,但
NaN!=NaN
,因为它可以以多种不同的方式生成


请注意,检查一下,我认为这实际上是严格未定义的行为,因为该标准实际上不需要使用IEEE 754或等效的浮点标准,并且实际上不支持NaN。如果支持NaN,则第7.2.14节(中)要求NaN比较返回false。

问题不在于
a[5]
5[a]
。这是因为NaN永远不等于任何东西,包括它自己。有更多关于比较NaN和无穷大的详细信息。

IEEE xxx定义了
NaN==NaN
以返回
false
。这是一个完全没有意义的问题。为什么要把事情复杂化?@CoollerProject与NaN进行比较时,即使与NaN进行比较,也会返回一个无序的结果。我添加了IEEE-754标记。我对人们一使用浮点就宣布“未定义的行为”感到有点沮丧。现在有多少系统不使用IEEE-754?我可以想象一些嵌入式低端系统可能不会,但除此之外?我不确定为什么会关闭,我认为这是一个非常体面的问题。我没有在双值解释的定义中查找它,但我记得任何与NAN值的比较都被定义为返回false。如果你需要知道一个值是否为Na,那么有一个方法可以做到这一点。(SvenS也要这样)@首选的方法是调用<代码> ISNAN <代码>宏或函数,但是另一个是检查代码> x==x< /Case>是否返回假。我把问题作为C++来解决,因为<代码> cUT感谢链接…知道了。。。
false