-3

为什么会发生这种情况

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

印刷

false
4

2 回答 2

23

编译器没有弄错,它与a[5] == 5[a]. zero/zero是一个无意义的表达式,并NaN作为结果被赋值,但NaN != NaN因为它可以以多种不相等的方式产生。

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

于 2013-09-04T07:35:41.263 回答
5

问题不在于a[5]vs. 5[a]. 那是 NaN 永远不等于任何东西,包括它自己。这个 gnu.org 页面有更多关于比较 NaN 和 Infinity 的详细信息。

于 2013-09-04T07:38:18.853 回答