这个 if 语句的运算符优先级是什么?

What is the operator precedence of this if statement?

我正在盯着别人写的下面的表情:

if (variableA == CaseA && GetCase(variableB) == CaseA && GetCase(variableC) == CaseA && !CaseB(variableB) || variableA != CaseA)
{
    // do stuff
}

真正让我感到困惑的是这一点:

!CaseB(variableB) || variableA != CaseA

因为没有任何括号将条件组合在一起。

C++ 编译器将如何评估这些 if 语句?如果 AND 运算符之一的计算结果为 false,这是否意味着 OR 不会因短路而被检查?

编辑

哇,我想仇恨者今天真的很想仇恨,考虑到除了问题的 -4(并且还在计算?)之外每个答案的否决票数量。而且,呃,没有实际解释为什么?哈哈

保持优雅,伙计们。保持优雅。 ;)

郑重声明,就为问题提供有效答案而言,简单地说明有一个 "left to right evaluation" 并不能说明什么。在 posting 之前,我确实使用了 Google 的强大功能(这也导致了我在这里阅读的一些 post)。

我承认我的错误是没有提到这一点,虽然我认为 C++ 参考是最自然的 link 到 post 作为答案的补充,但最好的我无意中从 here 获得的信息通过源代码示例中的以下引用:

|| has lower precedence than &&

这可以说是模糊的,因为 "lower precedence" 实际上并没有具体说明在这种情况下的含义。

无论哪种方式,那些真正为您做出贡献的人都会收到赞成票 - 我将接受给我真正想要的答案。

运算符 && 的优先级高于运算符 ||,因为 seen here 因此所有 && 将首先出现,然后是 ||,在换句话说,如果我添加括号

if ((variableA == CaseA && GetCase(variableB) == CaseA && GetCase(variableC) == CaseA && !CaseB(variableB)) || variableA != CaseA)

所以基本上

if (all_the_ands || variableA != CaseA)

如果那个表达式的左边是true,右边会因为短路而不会执行。

在您的示例中,运算符优先级如下。

! > == > && > ||

所以,评估的第一个语句将是

1) !CaseB(variableB) 仅当所有其他“&&”条件恰好为真时。如果 "variableA == CaseA && GetCase(variableB) == CaseA && GetCase(variableC) == CaseA " 中的任何一个为假,则此处将发生短路,并且“!CaseB(variableB)”获胜'不被处决。

之后,

2) 如果条件 1) 为真,再次短路(正如你猜对的那样)否则 "||"条件将被评估。

你是对的,如果条件2)恰好为真,其他or(||)条件甚至不会因为短路而被检查。

http://en.cppreference.com/w/cpp/language/operator_precedence

优先级如 Sachin Goyal 的回答中所列(并且在上面 link 中更清楚地列出)。

似乎让您感到困惑的特定优先级细节是 ! 直接关联到 CaseB(variableB) 而不是任何更大的东西。

顺序从左到右穿过每个 &&||,并短路。

如果您询问的 !CaseB(variableB) || variableA != CaseA 左侧的表达式是 false,则跳过 !CaseB(variableB) 并计算 variableA != CaseA。但如果前面的表达式为真,它会使用 !CaseB(variableB) 的值来决定是否评估其余部分。

初始测试 variableA == CaseA 与最终测试 variableA != CaseA 的组合似乎很混乱。这可能意味着什么是预期的,但可以更简单地完成。

当您编码 (X && Y && Z) 时,意思是 ((X && Y) && Z) 但由于 && 的行为方式,它与 (X && (Y && Z)) 相同。所以 variableA == CaseA 就像 && 的其余操作数的守卫,所以当它是 false 时,你会一直跳到 [=13= 的另一边] 并进行相反的测试并最终解决 true。因此,仅从 variableA != CaseA ||

开始获得相同的效果会更简单

表达式等同于:

( (variableA == CaseA) && 
  (GetCase(variableB) == CaseA) && 
  (GetCase(variableC) == CaseA) && 
  (!CaseB(variableB))
) 
 || 
(variableA != CaseA)

表达式将从上到下计算(由于短路规则),如果前四行中的任何一行 return 为假,则剩余的前四行中的 none进行评估。如果(且仅当)前四行之一 return 为 false,则将评估最后一行。

但我感兴趣的是最后一行是第一行的否定