Nis*_*sha 5 c short-circuiting
我正在研究C的基础知识并试图解决下面的问题,任何人都可以解释为什么变量的输出c
不同?
以下程序的输出是什么?
int main()
{
int a = -3, b = 2, c= 0, d;
d = ++a && ++b || ++c;
printf ("a = %d, b = %d, c = %d, d = %d", a, b, c, d);
}
Run Code Online (Sandbox Code Playgroud)
答案:-2,3,0,1
为什么c
输出中没有增加?
Jon*_*ler 10
变量c
不会递增,因为||
除非LHS求值为false,否则不会执行a 的RHS(右侧),并且LHS的计算结果为true.C ||
和&&
运营商是"短路"运营商; 他们不评估第二个操作数,除非第一个操作数不足以确定表达式的整体真实性.
该&&
比更紧密的结合||
,所以操作可以括号为:
d = (++a && ++b) || ++c;
Run Code Online (Sandbox Code Playgroud)
值为++a
-2,其值为true(因为任何非0的值的计算结果为true); 值为++b
3,其值为true; 所以这个&&
词的价值是真的.因为true || false
并且true || true
两者都评估true
,所以没有必要评估RHS以了解整体结果.(类似的规则&&
是,如果第一项计算结果为false,则不需要计算第二项,因为整体表达式必须为false.如果a = -1;
在测试之前有,则b
不会增加,因为++a
它将为零或假因此,其RHS &&
未被评估.当然,然后c
会增加,因为LHS ||
将是假的,并且必须评估RHS以确定总体结果.)
因为++a && ++b
评估到true
.
它被称为短路.条件内的表达式从左到右进行评估.如果是这种情况,如果OR
对子句中的第一个条件进行求值true
,那么第二个条件也无法进行求值,因为已知整个表达式true
已经存在.