为什么下面提到的程序的输出0不是20?
#include <stdio.h>
int main()
{
int i = 10, j = 0;
if (i || (j = i + 10))
/* do something */;
printf("%d\n",j);
}
Run Code Online (Sandbox Code Playgroud)
Gri*_*han 27
是的,这个概念叫做短路(逻辑上&&,||运算符表达式).
在任何逻辑表达式(包括||,&&)的情况下,编译器一旦结果评估就停止评估表达式(并保存执行).
短路技术是:
!0 || any_expression== 1,所以any_expression不需要评估.
而且因为在你的表达i是不为零,但其10,所以你可以认为如果consdition (i || (j = i + 10)) 一样i.
逻辑OR运算符:
该||运营商保证左到右的评价; 在评估第一个操作数后有一个序列点.如果第一操作数进行比较unequal来0,第二个操作数not进行评价.
类似地,对于&&(和运算符):
0 && any_expression== 0,所以any_expression不需要进行求值.
在你的表达中:
(i || (j = i + 10) )
------------
^
| Could evaluate if i is 0,
as i = 10 (!0 = true), so j remains unchanged as second operand is not evaluated
Run Code Online (Sandbox Code Playgroud)
对于或||操作员的回答可以是0,1.为了保存执行,一旦结果找到,评估就会停止.因此,如果第一个操作数为非零1 ,则表达式将为(如上所述).因此,对于第一个操作数i = 10比较不等于0,第二个操作数(j = i + 10)不会被评估,因此j保持0代码的输出0.
注意:短路行为不仅存在于C中,而且概念在许多语言中都很常见,如Java,C++,Python.(但不是全部,例如VB6).
在C中,保证逻辑表达式的短路一直是C的一个特征.当Dennis Ritchie设计并实现C的第一个版本时,确实如此,在1989 C标准中仍然如此,并且在C99标准中仍然如此.
相关文章:C/C++中强制要求短路布尔运算符吗?和评估顺序?