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

在C中有以下内容:

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

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

仅当abc(1)false才会调用abc(2)

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

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

不,它不会。 这称为“短路” ,它是一种常见的流量控制机制:

使用a && bb仅在a为真时进行评估; 如果a是假的,整个表达式必定是假的。

a || b a || bb仅在a为假时进行评估; 如果a是假的,整个表达式可能仍然是真的。

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

如果abc(1)返回false ,那么它是有保证的,那将调用abc(2)


它与&&类似:如果你有abc(1) && abc(2)abc(2)只会被调用如果abc(1)返回true并且不会被调用,如果abc(1)返回false


这背后的想法是:

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

这来自布尔代数

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

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

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

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

(重点是我的。)

这同样适用于|| 运营商。

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

您可能还会读到: |之间的区别 和|| 或&&和&&进行比较

nop,仅当left语句为false时才调用第二个abc(2)

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

&&形成对比,它从左到右一直持续到一个条件为 (或者它结束)。

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

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

例如,在广泛使用的情况下的运行时故障,例如if (*ptr && (ptr->number > other_number) )