C语篇中的“和”和“或”运算符

时间:2016-12-22 14:52:48

标签: c optimization logical-operators evaluation logical-and

我总是想知道某件事,而在其他地方找不到答案。如果我有这段代码:

if ((cond1) &&(cond2) && (cond 3) && (cond 4))
 {
       // do something
 }

假设第一个条件是假的,那么我的程序也会验证其他条件,或者只是跳过验证它们?

但如果我有

if ((cond1) ||(cond2) || (cond 3) || (cond 4))
 {
       // do something
 }

和cond 1是真的,我的程序会立即转到if部分还是继续验证其他条件?

2 个答案:

答案 0 :(得分:4)

引用C11标准,章节§6.5.13,逻辑AND运算符强调我的

  

与按位二进制&运算符不同,&&运算符保证从左到右的评估;   如果计算第二个操作数,则在评估之间存在一个序列点   第一和第二个操作数。 如果第一个操作数比较等于0,则第二个操作数   操作数未被评估。

因此,如果第一个条件(LHS操作数)的计算结果为 false ,则后面的条件,即&&的RHS操作数进行评估。

类似地(讽刺地,而不是),对于逻辑“OR”运算符,

  

与按位|运算符不同,||运算符保证从左到右的评估;如果   评估第二个操作数,在第一个操作数的评估之间有一个序列点   和第二个操作数。 如果第一个操作数比较不等于0,则第二个操作数为   未评估。

答案 1 :(得分:2)

在C&&&和|| “sort-circuit”,意思是如果左​​操作数的评估足以确定结果,则不评估右操作数。