内部多个条件的评估顺序"如果"条款

时间:2016-11-16 09:24:06

标签: c++

当我指定超过2个条件时,我试图在if子句中找到评估顺序。我找到了多个结果来讨论如何评估2个条件。我的问题是,当我有类似的东西时,

it=seqMap.find(a);

if( a !="" && it==seqMap.end() || isEven )
{
//Do something
}

我知道这不是编写代码的正确方法,而且括号很重要,但我试图了解这是如何工作的,出于好奇。

3 个答案:

答案 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

进行“或”运算