编译器警告C4806(number == bool值)的动机是什么?

时间:2017-01-18 18:42:57

标签: c++ compiler-warnings

为什么true==151被认为是不安全的操作,true==true实际上持有相同的表达式,而不是。此外,与true==151不同,为什么true&&151永远不会成真?

cout<<(true==151);      //0 and it gives compiler warning C4806
cout<<(true==true);     //1 no warning
if(true==151)cout<<"1"; //"0" and warning again
if(true&&151)cout<<"1"; //1 no warning
if(151)cout<<"1";       //1

警告C4806本身

  

'==':不安全的操作:没有提升为类型'int'的'bool'类型的值可以等于给定的常量

1 个答案:

答案 0 :(得分:5)

首先让我们回答您的第二个问题:true==151始终为false,因为true被定义为具有值1

一般情况下如果将数值解释为布尔值,则0将为false,其他任何内容都为true;但文字true必须有一个特定的值,该值为1.

那么为什么警告操作数是bool和整数的==?好吧,首先是因为151==true,如果你注意它,看起来应该是真的(因为151是&#34;真正的&#34;值)但是 - 如上所述 - 它是不。它可能是错误的来源,因此值得警告。更一般地,您直接比较两种不同的类型,其中隐式转换可能不明显/可能具有非明显的后果。