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


In C does the logical operator end if one side of a || is true?

本问题已经有最佳答案,请猛点这里访问。

C:have the followingP></

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

如果我abc(1 == 1)true呼叫abc(2)会归来吗?P></


不,不会。这叫做"短路",是一种常见的流量控制机制:

对于a && b,只有当a为真时,才计算b;如果a为假,则整个表达式必须为假。

对于a || b,只有当a为假时,才会对b进行评估;如果a为假,则整个表达式可能仍然为真。


不,根据标准,如果abc(1)返回true,则不会调用abc(2)

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

&&类似:如果你有abc(1) && abc(2),只有abc(1)返回true时,才会调用abc(2),如果abc(1)返回false时,不会调用EDOCX1。

这背后的想法是:

1
2
3
4
5
true OR whatever -> true
false OR whatever -> whatever

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

这来自布尔代数


If abc(1==1) returns true will then call abc(2) ?

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

C11(n1570), § 6.5.13 Logical AND operator

Unlike the bitwise binary & operator, the && operator guarantees left-to-right evaluation; if the second operand is evaluated, there is a sequence point between the evaluations of
the first and second operands. If the first operand compares equal to 0, the second operand is not evaluated.

(重点是我的。)

这同样适用于||运算符。


在C语言中,逻辑||操作符从左到右进行测试,保证了这一点。如果整个语句为真,则任何一个条件都可以为真。因此,||一直从左向右移动,直到一个条件成立,然后停止(或到达终点)。所以不,如果abc(1)返回true,则不会调用abc(2)

&&相反,&&一直从左向右移动,直到有一个条件是错误的(或到最后)。


只有当abc(1)false时,才会调用abc(2)

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

The || operator guarantees left-to-right evaluation; there is a sequence point after the evaluation of the first operand. If the first operand compares unequal to 0, the second operand is not evaluated.


不,只有当左边的语句是false时,才调用第二个abc(2)


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

您还可以阅读:用于比较的和或&;和&;之间的差异


不,这实际上是非常重要的,并且在逻辑运算符从左到右进行计算的标准中定义了这一点。当可以在不进一步计算操作数的情况下确定值时,将停止计算。至少我百分之百相信ANDOR

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

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