这个 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,则将评估最后一行。
但我感兴趣的是最后一行是第一行的否定
我正在盯着别人写的下面的表情:
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,则将评估最后一行。
但我感兴趣的是最后一行是第一行的否定