为何下述C程序中num2的值为-1而非0?
为什么num2的输出值是-1而不是0?
你的代码如下:
#include <stdio.h> int main(void) { int num1 = 0, num2 = -1, num3 = -2, num4 = 1, ans; ans = num1++ && num2++ || ++num4 && num3++; printf("%d %d %d %d %d", num1, num2, num3, num4, ans); return 0; }
运行输出:
1 -1 -1 2 1
问题核心在于C语言中&&和||的短路求值特性:当左边表达式的结果已经能确定整个逻辑表达式的最终结果时,右边的表达式会被直接跳过,完全不执行。我们拆解表达式一步步看:
因为&&的优先级高于||,所以原表达式等价于:(num1++ && num2++) || (++num4 && num3++)
先执行左边的
num1++ && num2++:- num1初始值是0,
num1++是后置自增,先返回当前值0(逻辑假),之后num1才会变成1。 - 对于
&&运算符,只要左操作数是假,整个表达式结果必然为假,因此右边的num2++会被短路,根本不会执行。所以num2保持初始值-1不变。
- num1初始值是0,
左边子表达式结果为假(0),因此需要执行
||右边的++num4 && num3++:++num4是前置自增,先把num4从1改成2,返回2(逻辑真)。- 对于
&&运算符,左操作数为真时必须执行右边表达式,所以num3++被执行:num3初始是-2,num3++先返回-2(逻辑真),之后num3变成-1。 - 这个子表达式结果为真(1),因此整个
||表达式的结果为真(1),ans被赋值为1。
最终各变量的变化:
- num1:执行了
num1++,从0变为1 - num2:
num2++未执行,保持-1 - num3:执行了
num3++,从-2变为-1 - num4:执行了
++num4,从1变为2 - ans:整个表达式结果为1
内容的提问来源于stack exchange,提问作者Anup
相关产品推荐
相关产品推荐

