为何(++i || ++j)中j未自增?C语言逻辑或短路求值疑问
为什么代码里的
++j没有被自增? 这个问题其实是C语言里短路求值的典型表现,我来给你掰扯清楚:
先把你的代码再贴一遍方便分析:
long i=5, j=10; if (++i || ++j) printf("%ld %ld\n", i, j); else printf("Prog1\n");
核心原因就在逻辑或运算符||的特性上:
- C语言中的
||遵循短路求值规则:当左边的表达式已经能确定整个逻辑表达式的结果时,右边的表达式会被直接跳过,完全不执行。 - 初始状态下
i=5,++i是前置自增操作——先把i的值改成6,然后这个表达式的返回值就是6。在C语言里,所有非零值都会被判定为“真”。 - 既然左边的
++i已经是“真”了,那整个||表达式的结果必然是“真”,程序根本没必要再去计算右边的++j。这就好比你要判断“要么吃苹果要么吃香蕉”,如果已经决定吃苹果了,就没必要再考虑吃香蕉的事了。 - 正因如此,
j的自增操作完全没机会运行,最后输出的自然是6 10。
内容的提问来源于stack exchange,提问作者Biljana Icovski
相关产品推荐
相关产品推荐

