为什么下面提到的程序的输出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++中强制要求短路布尔运算符吗?和评估顺序?
归档时间: |
|
查看次数: |
583 次 |
最近记录: |