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

Coo*_*ect -3 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;
Run Code Online (Sandbox Code Playgroud)

版画

false
Run Code Online (Sandbox Code Playgroud)

Jac*_*ley 23

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

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


Doc*_*Max 5

这个问题是不是a[5]5[a].NaN永远不会与任何东西相等,包括它自己.这个gnu.org页面提供了有关比较NaN和Infinity的更多细节.