a [8]是一系列布尔值.我试图计算一个布尔表达式,如下所示.
bool a[8]; ..... bool result=a[0]*(a[3]+a[6]*(a[4]+a[7]*a[5]))+a[1]*(a[6]*a[3]+a[4]+a[7]*a[5])+a[2]*(a[5]+a[7]*(a[4]+a[6]*a[3]));
表达很长,但概念上并不复杂.唯一的错误是,当我用&&替换表达式中的*(在两种情况下我都期望逻辑AND)或用||替换+时,结果似乎不同 (期待逻辑OR).
我不确定哪些是正确的,布尔运算符或乘法,加法等的数学符号.更糟糕的是,没有给出任何错误,即编译器对两者都满意.哪一个更安全,更正确?
他们几乎为同一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++
不是.
(这里并未真正相关,但值得注意的是:注意,&&
和||
,如果他们超载失去他们的短路属性).
除了逻辑运算符中的短路,这在这里没有区别之外,解释行为变化的关键区别在于运算符优先级.
当您更换*
使用&&
,或+
与||
,的优先顺序有所不同:*
具有较高的比优先级+
,但&&
具有较低的比优先级+
.这就是为什么你需要完全括起你的表达式,以强制所谓的操作顺序,只需*
替换为&&
.
更换两个*
和+
同&&
和||
将保留两家运营商相同的相对优先级,所以你最终会得到相同的结果.