Joh*_*itb 14
如果将未初始化的变量与自身进行比较,则可能发生任何事情.毕竟是未定义的行为.对于初始化的int变量,这不可能发生.
请注意,未显式初始化的namespace-scope,class-static和function-static int变量的值为0.然后它们不会比较相等.
我刚刚和Clang一起测试过:
int main() {
  int x;
  return (x == x);
}
使用-O1编译时,返回0,因为允许优化器假定x没有稳定值.
GCC对上述内容更加宽容,返回1.以下内容使GCC也返回0(显然,如果您可以选择,那么分支会更便宜):
int main() {
  int x;
  if(x == x) {
    return 1;
  }
  return 0;
}
最后,结果不仅取决于CPU执行代码,还取决于工具链中的任何其他内容.
尽管这肯定是不寻常的,但C ++确实可以int做到NaN。
首先,int除了数字值外,还可以存储信息。§3.9.1/ 1:
对于字符类型,对象表示的所有位都参与值表示。对于无符号字符类型,值表示形式的所有可能的位模式均表示数字。这些要求不适用于其他类型。
然后,numeric_limits<int>::has_quiet_NaN并且has_signaling_NaN不需要false为任何类型。§18.2.1.2/ 34-36:
Run Code Online (Sandbox Code Playgroud)static const bool has_quiet_NaN;34如果类型具有一个安静(无信号)“不是数字”的表示,则为真。
35对所有浮点类型有意义。
36对于is_iec559!= false的所有专业都应为true。
“对所有浮点类型有意义”有点麻烦,因为它打开了该值可能毫无意义的可能性,但这肯定是一种推断。
如果为numeric_limits<int>::has_quiet_NaN == true,则numeric_limits<int>::quiet_NaN()返回这样的值。
显然,这不是您应该在代码中担心的事情。