在C中,如果||的一侧,逻辑运算符结束是真的?

时间:2013-04-10 13:19:34

标签: c

在C中有以下内容:

return (abc(1) || abc(2));

如果abc(1 == 1)返回true,则会调用abc(2)

8 个答案:

答案 0 :(得分:9)

不,它不会。这称为"short-circuiting",它是一种常见的流量控制机制:

a && b仅在b为真时评估a;如果a为false,则整个表达式必定为false。

使用a || bb仅在a为假时进行评估;如果a为false,整个表达式可能仍为真。

答案 1 :(得分:5)

没有。保证(通过标准),如果abc(1)返回true,则不会调用abc(2)

如果abc(1)返回false,则保证会被abc(2)调用。


&&类似:如果您有abc(1) && abc(2)abc(2)将仅在abc(1)返回true时被调用,并且如果{abc(1)将不会被调用{1}}返回false


这背后的想法是:

true OR whatever -> true
false OR whatever -> whatever

false AND whatever -> false
true AND whatever -> whatever

这来自boolean algebra

答案 2 :(得分:3)

  

如果abc(1 == 1)返回true,则调用abc(2)?

不,它不会。此行为称为短路。它受C和C ++标准的保证。

  

C11(n1570),§6.5.13逻辑AND运算符

     

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

(重点是我的。)

同样适用于||运算符。

答案 3 :(得分:1)

||(逻辑比较)打破了进一步的检查,而|(按位比较)没有。

您可能还会阅读:Difference between | and || or & and && for comparison

答案 4 :(得分:1)

nop,仅当左边的语句为abc(2)时才会调用第二个false

答案 5 :(得分:1)

仅当abc(2)abc(1)

时,才会调用

false

根据C99规范,逻辑OR运算符表示

  

||运营商保证从左到右的评估;在评估第一个操作数后有一个序列点。如果第一个操作数将不等于0,则不计算第二个操作数。

答案 6 :(得分:1)

在C中,逻辑||运算符从左到右进行测试,保证。要使整个陈述成立,任何一种情况都可以成立。所以||从左到右一直持续到一个条件为真,然后停止(或者它到达终点)。所以不,如果abc(1)返回true,则不会调用abc(2)

&&对比,{{1}}从左到右,直到一个条件为 false (或者它结束)。

答案 7 :(得分:0)

没有。这实际上是非常重要的,并且在标准中定义逻辑运算符从左到右进行评估。当可以在不进一步评估操作数的情况下确定该值时,停止评估。至少我对ANDOR 100%肯定。

这是一个非常重要的问题,因为操作数的评估不能通过重组顺序来隐式并行化或优化,因为预期结果可能不同。

E.g。广泛使用案例中的运行时问题,例如if (*ptr && (ptr->number > other_number) )