a [8]是一系列布尔值。我试图计算一个布尔表达式,如下所示。
./HideMarker someImage.dcm result.png
表达很长,但概念上并不复杂。唯一的错误是,当我用&&替换表达式中的*时,结果似乎有所不同。 (在两种情况下我都期望逻辑AND)或用||替换+ (期待逻辑OR)。
我不确定哪些是正确的,布尔运算符或乘法,加法等的数学符号。更糟糕的是,没有任何错误,即编译器对两者都满意。哪一个更安全,更正确?
答案 0 :(得分:8)
bool
个操作数的几乎相同。但是有一些微妙的差异:
*
和+
会将bool
类型参数扩展为int
类型。
表达式a || b
的类型为bool
,而a + b
为int
。同样适用于&&
和*
。
*
和+
不是排序点,而&&
和||
则是。
*
和+
没有短路,而&&
和||
则是。
它们在运算符优先级表中占据非常不同的位置。因此,替换不是直截了当的。
如果a
是bool
,b
也是bool
但未初始化,则定义a || b
的行为,但是a + b
未定义,因为bool
可以在C ++中包含陷阱表示。可以为&&
和*
召唤相似的表达方式。
很长的a + b + c + ...
链可能溢出int
类型,其行为未定义。
(3)表示a++ * a++
是未定义的行为,但a++ || a++
不是。
(这里并不重要,但值得注意:请注意&&
和||
如果超载则会失去短路属性。
答案 1 :(得分:5)
除了逻辑运算符中的短路(这在这里没有区别)之外,解释行为变化的关键区别是operator precedence。
当您将*
替换为&&
或+
替换为||
时,优先顺序会更改:*
更高优先级高于+
,但&&
的低于优先级高于+
。这就是为什么你需要完全括起你的表达式,以强制所谓的操作顺序,只用*
取代&&
。
用*
和+
替换&&
和||
将保持两个运算符的相对优先级相同,因此您最终会得到相同的结果。< / p>