逻辑运算符在 if 语句中是否相互影响?

Do logical operators affect each other in a if statement?

我有 4 个陈述,如果陈述 1 为真,我只想检查陈述 2-4 以下是我想要实现的伪代码

if (statement 1) {
  if (statement 2 or statement 3 or statement 4){
    do something()
  }
}

我想知道下面的代码是否会做同样的事情

if(s1 && s2 || s3 || s4) {
  doSomething();
}

或者如果我必须这样做的话

if (s1) {
  if (s2 || s3 || s4) {
     doSomething();
  }
}

由于operator precedence

if(s1 && s2 || s3 || s4) 

相同
if((s1 && s2) || s3 || s4) 

因为 && 的优先级高于 ||。你要的是

if(s1 && (s2 || s3 || s4)) 

仅当 s1 为真且 s2s3s4 中的任何一个为真时才为真。

你也在 guaranteed to have short circuiting&& 只要它是内置运算符,这意味着如果 s1 为假,s2s3s4 将不会被评估。对于内置运算符,|| 也会发生这种情况,一旦您遇到一个 true 表达式,其余表达式就不会被评估为 true 或任何东西都为 true。

在 C++ 中,逻辑运算符 &&|| 是短路的 - 这意味着运算符的左操作数将首先被评估,如果结果不是受到进一步评估的影响,然后它会停在那里。例如,如果 x() 为真,x() && y() 确实只会计算 y(),如果 x() 为假,x() || y() 只会计算 y()

作为建议,您应该注意在事物周围加上括号,以更清楚地表明您想要的操作顺序:

s1 && (s2 || s3 || s4)

而不是

s1 && s2 || s3 || s4

您需要在 || 语句中加上括号。所以:

if(s1 && (s2 || s3 || s4)) { // << note the parenthesis
  doSomething();
}

等同于

if (s1) {
  if (s2 || s3 || s4) {
     doSomething();
  }
}

这是因为短路评估。基本上,如果 s1 为假,则不会评估括号。你可以阅读它 here.