C语言前置与后置自增问题:为何y、z前置自增未执行?
C语言逻辑运算符短路求值问题解析
题目
假设x、y、z均为整型变量,执行以下代码后,x、y、z的输出结果是什么?
int x=6, y=4, z=2; printf("%d ", ++x || ++y && ++z); printf("%d %d %d", z, y, x);
选项:
- (A) 0 6 4 2
- (B) 1 7 4 2
- (C) 1 2 4 6
- (D) 1 2 4 7
疑问
为何答案为D,且y和z的前置自增运算符未生效?
解析
核心原因是C语言中逻辑运算符的短路求值特性,结合规则分析如下:
- 短路求值触发逻辑
逻辑或(||)的短路规则是:只要左边表达式结果为真(非0),右边表达式会直接被跳过执行——因为逻辑或只要有一个操作数为真,整个表达式结果就为真,无需再计算后续部分。
这里++x是表达式左半部分:x初始值为6,执行++x后x变为7,7是非零值,在C语言中被判定为真。因此右边的++y && ++z完全不会执行,y和z的自增操作根本没机会运行,保持初始值4和2不变。 - 输出结果拆解
- 第一个
printf输出整个逻辑表达式的结果,C语言中用1表示真,所以先输出1。 - 第二个
printf按顺序输出z、y、x的值,也就是2 4 7。
两者结合起来就是1 2 4 7,对应选项D。
- 第一个
内容的提问来源于stack exchange,提问作者Bolonha
相关产品推荐
相关产品推荐

