*和+分别等同于&&和||在布尔操作数上?

时间:2017-01-20 10:26:26

标签: c++ boolean operators boolean-expression boolean-operations

a [8]是一系列布尔值。我试图计算一个布尔表达式,如下所示。

./HideMarker someImage.dcm  result.png

表达很长,但概念上并不复杂。唯一的错误是,当我用&&替换表达式中的*时,结果似乎有所不同。 (在两种情况下我都期望逻辑AND)或用||替换+ (期待逻辑OR)。

我不确定哪些是正确的,布尔运算符或乘法,加法等的数学符号。更糟糕的是,没有任何错误,即编译器对两者都满意。哪一个更安全,更正确?

2 个答案:

答案 0 :(得分:8)

bool个操作数的几乎相同。但是有一些微妙的差异:

  1. *+会将bool类型参数扩展为int类型。

  2. 表达式a || b的类型为bool,而a + bint。同样适用于&&*

  3. *+不是排序点,而&&||则是。

  4. *+没有短路,而&&||则是。

  5. 它们在运算符优先级表中占据非常不同的位置。因此,替换不是直截了当的。

  6. 如果aboolb也是bool但未初始化,则定义a || b的行为,但是a + b 未定义,因为bool 可以在C ++中包含陷阱表示。可以为&&*召唤相似的表达方式。

  7. 很长的a + b + c + ...链可能溢出int类型,其行为未定义。

  8. (3)表示a++ * a++是未定义的行为,但a++ || a++不是。

    (这里并不重要,但值得注意:请注意&&||如果超载则会失去短路属性。

答案 1 :(得分:5)

除了逻辑运算符中的短路(这在这里没有区别)之外,解释行为变化的关键区别是operator precedence

当您将*替换为&&+替换为||时,优先顺序会更改:* 更高优先级高于+,但&&低于优先级高于+。这就是为什么你需要完全括起你的表达式,以强制所谓的操作顺序,只用*取代&&

*+替换&&||将保持两个运算符的相对优先级相同,因此您最终会得到相同的结果。< / p>