【问题标题】:What is the motivation for Compiler Warning C4806 (number==bool value)?编译器警告 C4806(数字==布尔值)的动机是什么?
【发布时间】:2017-01-19 02:53:13
【问题描述】:

为什么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'类型的值可以等于给定的常量

【问题讨论】:

  • 包含整个消息而不仅仅是其代码是个好主意。信不信由你,但我们中的许多人还没有将所有 Microsoft 的错误代码都记入记忆中。
  • 不同的类型。真的是黄色吗?
  • @ZDF 真理有颜色吗?
  • @molbdnilo :) 黄色是真的吗?

标签: c++ compiler-warnings


【解决方案1】:

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

一般来说如果您将数值解释为布尔值,0 将为假,其他任何值都为真;但是文字 true 必须有一个特定的值,并且该值是 1。

那么,为什么要警告==,其中操作数是布尔值和整数?嗯,首先因为151==true,如果你用眼睛看,它看起来应该是真的(因为 151 是一个“真”值)但是 - 如上所述 - 它不是。这可能是错误的来源,因此值得警告。更一般地说,您是在直接比较两种不同的类型,其中隐式转换可能不明显/可能有不明显的后果。

【讨论】:

  • 另一方面,我可以想象这样一种情况,将其重新编码为 true == bool(151) 可能至少是有效的代码(尤其是如果您将 151 替换为变量),但即便如此,它也可能是表明某些事情可以做得更干净......
  • bool 只能是truefalse,除非调用未定义的行为,否则没有别的。
  • 是的......无论好坏,这就是将一种语言与灵活的布尔运算符应用程序结合起来并在其中粘贴bool 类型的混淆。尽管有@Ics 的观察,if( 151 ) 的定义还是很完美,它的解释清楚地表明 151 是一个逻辑上的真实值......
  • @MarkAdelsberger 问题在于该语言要求对相同类型的两个操作数执行比较(在提升之后)。 bool 值转换为整数而不是 bool 的整数。所以编译器看到if (1==151)
  • @RichardCritten - 在您看来,问题是比较必须是类似的类型?我不同意。问题是它们的 bool 类型与 C(以及 C++)历史上使用的逻辑习语相矛盾。我不确定这其中的哪一部分让您认为我不知道编译器看到了什么;如果您要阅读我的回答,您会注意到我已经指出了这一点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-10
  • 2012-07-11
相关资源
最近更新 更多