【问题标题】:Implicit bool evaluation with if conditions [duplicate]带有if条件的隐式布尔评估[重复]
【发布时间】:2013-10-24 21:36:39
【问题描述】:

我有一个称为“count”的整数,当满足某个条件时它会递增。所以我想问如果你写这个条件会发生什么:

if(count % 2)
{
    return even_bit; 
}
else
{
    return odd_bit;
}

问题基本上是询问如果您没有在整数数据类型变量的表达式中明确定义,上面的 if 条件是检查条件 count%2 = 0 还是 count%2 !=0。

【问题讨论】:

  • 为什么不能直接编译运行代码?
  • 0false,任何其他整数值是 true
  • “评估这些条件中的哪些”是什么意思?我只看到一种情况。
  • 在 C 语言编程中,程序员使用 0 和 1 而不是 false 和 true,C++ 的数据类型为 bool,您可以定义 bool myvar; 但是,例如 last ,您可以使用 0 和 1。
  • 这个问题,恐怕是一清二楚。你在问% 做什么?

标签: c++ c


【解决方案1】:

如果表达式的计算结果为0,它将被解释为FALSE - 对于任何非零值,它将被解释为TRUE。换句话说,

if(count % 2)

等价于

if(count % 2 != 0)

所以你的代码是“倒退”的。如果该陈述为真,count 很奇怪,您很可能希望返回 odd_bit(只是在这里猜测。)。

【讨论】:

  • 当然,这就是为什么你永远不会真正想要像他那样写它的原因。如果表达式的类型为bool,那么就可以了(事实上,任何进一步的比较,例如与truefalse 的比较都会令人困惑)。如果不是bool,你不要指望一个有点晦涩难懂的隐式转换,你写你想要的转换。
  • @JamesKanze 这是一个见仁见智的问题。我通常更喜欢避免不必要的比较,当涉及到 % 运算符时,尤其是。 % 运算符的结果是余数。该结果的布尔评估回答了一个问题是否还有一些余数。
  • @JamesKanze 许多 C 程序员也习惯于其他运算符的常用习语,例如与if (flag & MY_FLAG_NAME == MY_FLAG_NAME) 等相比,if (flag & MY_FLAG_NAME) 通常也更可取。
  • 非常感谢。这回答了我的问题。这是我设置的偶校验位,当有奇数个时,它是一个。
  • 很高兴它有帮助。我希望你意识到这个函数确实返回count的奇偶校验位。你必须为此做一些更高级的事情。例如,请参阅stackoverflow.com/questions/19373034/… 了解一种方法(以及几种解释,包括我自己的出色解释... :-))
【解决方案2】:
if(count % 2)  

等价于

if(count % 2 != 0)  

现在这一切都取决于count 是偶数还是奇数。如果是偶数,count%2FALSE(返回 odd_bit),如果 count 是奇数,则 count%2TRUE(返回 even_bit)。

【讨论】:

  • 其实相当于if ( static_cast<bool>( count % 2 ) )。也就是说,实际上与if ( count % 2 != 0 ) 相同。我不知道你从哪里得到第三个变种。
  • 第三个变体不正确,因为 any 非零表达式将评估为真。
  • @JamesKanze;是的,你是对的。
猜你喜欢
  • 2019-06-15
  • 1970-01-01
  • 2019-03-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-10
  • 2018-06-06
  • 1970-01-01
相关资源
最近更新 更多