在C中有以下内容:
return (abc(1) || abc(2));
如果abc(1 == 1)
返回true
,则会调用abc(2)
?
答案 0 :(得分:9)
不,它不会。这称为"short-circuiting",它是一种常见的流量控制机制:
a && b
仅在b
为真时评估a
;如果a
为false,则整个表达式必定为false。
使用a || b
,b
仅在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
答案 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)
没有。这实际上是非常重要的,并且在标准中定义逻辑运算符从左到右进行评估。当可以在不进一步评估操作数的情况下确定该值时,停止评估。至少我对AND
和OR
100%肯定。
这是一个非常重要的问题,因为操作数的评估不能通过重组顺序来隐式并行化或优化,因为预期结果可能不同。
E.g。广泛使用案例中的运行时问题,例如if (*ptr && (ptr->number > other_number) )