1

在 C 中有以下内容:

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

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

4

8 回答 8

9

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

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

With a || b,b仅在a为 false 时评估;如果a为假,则整个表达式可能仍然为真。

于 2013-04-10T13:20:53.293 回答
5

不。它保证(由标准),如果abc(1)返回trueabc(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

这来自布尔代数

于 2013-04-10T13:20:51.040 回答
3

如果 abc(1==1) 返回 true 将调用 abc(2) 吗?

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

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

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

(重点是我的。)

这同样适用于||操作员。

于 2013-04-10T13:22:08.063 回答
1

||(逻辑比较)会中断进一步检查,而|(按位比较)则不会。

您可能还会阅读:之间的区别 | 和 || 或 & 和 && 用于比较

于 2013-04-10T13:21:36.980 回答
1

nop,abc(2)仅当 left 语句为false

于 2013-04-10T13:22:09.790 回答
1

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

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

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

于 2013-04-10T13:22:24.950 回答
1

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

与 相比&&,它一直从左到右,直到一个条件为(或它到达最后)。

于 2013-04-10T13:23:38.057 回答
0

不,这实际上是不平凡的,并且在标准中定义逻辑运算符从左到右进行评估。当无需进一步评估操作数即可确定该值时停止评估。至少我 100% 确定ANDOR

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

例如,广泛用例中的运行时问题,例如if (*ptr && (ptr->number > other_number) )

于 2013-04-10T13:23:46.593 回答