为何这段C语言代码输出为9?i的递增为何在每次比较后执行?
解答你的两个C语言代码问题
先把代码格式化后放出来,方便咱们分析:
#include <stdio.h> int main() { int i=0; while(i++,i<=8); printf("%d\n",i); return 0; }
1. 该代码的输出结果为何是9?
咱们一步步拆解循环的执行流程就能明白:
- 初始状态下
i=0 - 进入
while循环的条件判断时,会执行整个逗号表达式i++,i<=8:- 先执行左侧的
i++:i的值从0变成1 - 再执行右侧的
i<=8:此时i是1,1<=8为真,循环继续(注意这个while的循环体是空的,只有末尾的分号;)
- 先执行左侧的
- 之后每次循环都会重复这个逻辑:先让i加1,再判断是否小于等于8
- 当i的值走到8时:
- 执行
i++后,i变成9 - 再判断
9<=8,结果为假,循环终止
- 执行
- 最后执行
printf,此时i的值是9,所以输出9
核心逻辑是逗号表达式的执行规则:逗号分隔的多个表达式会从左到右依次执行,整个逗号表达式的结果由最后一个表达式的值决定。所以每次循环判断时,i都会先完成递增,再进行比较。
2. 关于“递增操作是否在比较之后执行”的澄清
首先得纠正一个小误解:这段代码里i的递增操作是在比较之前执行的,而不是之后~
可能你是把这个写法和常见的while(i<=8) {i++;}搞混了。这里的关键是while(i++,i<=8)里的内容是一个完整的逗号表达式:
- 逗号运算符是C语言里优先级最低的运算符,所以整个表达式会严格按从左到右的顺序执行
- 第一步执行
i++:不管后置递增的返回值,i的数值会先完成加1操作 - 第二步才执行
i<=8:用递增后的i值做比较,比较结果决定循环是否继续
如果写成while(i<=8,i++),那才是先比较再递增,但你的代码里逗号表达式的顺序是i++,i<=8,所以递增在前,比较在后。
内容的提问来源于stack exchange,提问作者Aarvi
相关产品推荐
相关产品推荐

