为什么会发生这种情况
double zero = 0.0;
double a[] = { 0,0,0,0,0, zero/zero}; // NaN
cout << (a[5] == 5[a] ? "true" : "false") << endl;
印刷
false
编译器没有弄错,它与a[5] == 5[a]
. zero/zero
是一个无意义的表达式,并NaN
作为结果被赋值,但NaN != NaN
因为它可以以多种不相等的方式产生。
请注意,检查一下我认为这实际上是严格未定义的行为,因为该标准实际上并不需要使用 IEEE 754 或等效的浮点标准,并且实际上不支持 NaN。在它确实支持 NaN 的情况下,第 7.2.14 节(在2011 草案标准中)要求 NaN 比较返回 false。
问题不在于a[5]
vs. 5[a]
. 那是 NaN 永远不等于任何东西,包括它自己。这个 gnu.org 页面有更多关于比较 NaN 和 Infinity 的详细信息。