在C中,如果||的一侧,逻辑运算符结束 是真的?
在C中有以下内容:
return (abc(1) || abc(2));
如果abc(1 == 1)
返回true
则会调用abc(2)
?
仅当abc(1)
为false
才会调用abc(2)
根据C99规范,逻辑OR运算符说
|| 运营商保证从左到右的评估; 在评估第一个操作数后有一个序列点。 如果第一个操作数比较不等于0,则不计算第二个操作数。
不,它不会。 这称为“短路” ,它是一种常见的流量控制机制:
使用a && b
, b
仅在a
为真时进行评估; 如果a
是假的,整个表达式必定是假的。
带a || b
a || b
, b
仅在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)
。
与&&
形成对比,它从左到右一直持续到一个条件为假 (或者它结束)。
不。这实际上是非常重要的,并且在标准中定义逻辑运算符从左到右进行评估。 当可以在不进一步评估操作数的情况下确定该值时,停止评估。 至少我对AND
和OR
100%肯定。
这是一个非常重要的问题,因为操作数的评估不能通过重组顺序来隐式地并行化或优化,因为预期结果可能不同。
例如,在广泛使用的情况下的运行时故障,例如if (*ptr && (ptr->number > other_number) )