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

Del*_*lla 2 c++ boolean operators boolean-expression boolean-operations

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]));
Run Code Online (Sandbox Code Playgroud)

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

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

Bat*_*eba 8

他们几乎为同一bool操作数.但是有一些微妙的差异:

  1. *并将类型的类型参数+加宽.boolint

  2. 类型表达的a || bbool,而a + bint.同上&&*.

  3. *并且+不是排序点,而是&&||.

  4. *并且+没有短路,&&而且||是.

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

  6. 如果abool,并且b也是一个bool但不那么初始化的行为a || b被定义,但a + b未定义由于bool 可以包含在C++陷阱表示.类似的表达可以用来&&*.

  7. 一个很长的链a + b + c + ...可以溢出int类型,其行为是未定义的.

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

(这里并未真正相关,但值得注意的是:注意,&&||,如果他们超载失去他们的短路属性).


das*_*ght 5

除了逻辑运算符中的短路,这在这里没有区别之外,解释行为变化的关键区别在于运算符优先级.

当您更换*使用&&,或+||,的优先顺序有所不同:*具有较高的比优先级+,但&&具有较低的比优先级+.这就是为什么你需要完全括起你的表达式,以强制所谓的操作顺序,只需*替换为&&.

更换两个*+&&||将保留两家运营商相同的相对优先级,所以你最终会得到相同的结果.