在 C 中有以下内容:
return (abc(1) || abc(2));
如果abc(1 == 1)
返回true
将调用abc(2)
?
不,不会的。这称为“短路”,它是一种常见的流量控制机制:
与a && b
,b
仅在a
为真时评估;如果a
为假,则整个表达式必然为假。
With a || b
,b
仅在a
为 false 时评估;如果a
为假,则整个表达式可能仍然为真。
不。它保证(由标准),如果abc(1)
返回true
,abc(2)
将不会被调用。
如果abc(1)
返回false
,则可以保证,它将abc(2)
被调用。
它与&&
: 如果你有abc(1) && abc(2)
,abc(2)
只有在return 时才会被调用,如果 returnabc(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,abc(2)
仅当 left 语句为false
abc(2)
abc(1)
仅当is时才会被调用false
根据 C99 规范,逻辑 OR 运算符表示
|| 运算符保证从左到右的评估;在计算第一个操作数之后有一个序列点。如果第一个操作数比较不等于 0,则不计算第二个操作数。
在 C 中||
,保证从左到右测试逻辑运算符。要使整个陈述为真,任何一个条件都可以为真。所以||
一直从左到右,直到一个条件为真,然后停止(或到达终点)。所以不,如果abc(1)
返回 true 则abc(2)
不会被调用。
与 相比&&
,它一直从左到右,直到一个条件为假(或它到达最后)。
不,这实际上是不平凡的,并且在标准中定义逻辑运算符从左到右进行评估。当无需进一步评估操作数即可确定该值时停止评估。至少我 100% 确定AND
和OR
。
这是一个重要的问题,因为因此操作数的评估不能通过重新组织顺序来隐式并行化或优化,因为预期的结果可能不同。
例如,广泛用例中的运行时问题,例如if (*ptr && (ptr->number > other_number) )