当我指定超过2个条件时,我试图在if子句中找到评估顺序。我找到了多个结果来讨论如何评估2个条件。我的问题是,当我有类似的东西时,
it=seqMap.find(a);
if( a !="" && it==seqMap.end() || isEven )
{
//Do something
}
我知道这不是编写代码的正确方法,而且括号很重要,但我试图了解这是如何工作的,出于好奇。
答案 0 :(得分:2)
内置布尔运算符强制执行严格排序。他们有快捷评估,如果第一个参数确定结果,则甚至不评估第二个参数。在第二个参数的评估可能具有未定义行为的情况下,这很重要。
用户定义的布尔运算符通常不提供快捷方式评估。
可以模拟效果,但C ++并不真正支持这一点。 C#确实。
A && B || C
...被解析为
(A && B) || C
...因为&&
实际上比||
更高 precedence 。
但是,C ++语法没有按优先级定义。相反,它旨在模拟一个优先级,然后它出现作为语法的一个新兴特征。这意味着在某些情况下,天真的优先级视图可能表示不正确的解析,因此请谨慎使用优先推理。
答案 1 :(得分:1)
在C ++中,逻辑AND运算符的前置优先于逻辑OR运算符。
逻辑AND和OR运算符也有快捷方式评估。如果AND的第一个条件为假,则不会评估第二个条件。同样,如果OR的第一个条件为真,则不会评估第二个条件。
有关运算符先行的进一步参考: http://en.cppreference.com/w/cpp/language/operator_precedence
答案 2 :(得分:0)
首先评估
a !="" && it==seqMap.end()
如果a !=""
评估为false,则会检查
a !=""|| isEven
否则,如果a !=""
的评估结果为true,那么将评估it==seqMap.end()
最后,a !="" && it==seqMap.end()
的答案将与isEven