为何以下C语言代码输出8,5,2而非7,4,1?
解析C语言for循环的执行顺序问题
先看你给出的代码:
int fun(); int main() { for (fun(); fun(); fun()) printf("%d\n", fun()); return 0; } int fun() { int static n = 10; return n--; }
你的预期错误源于对for循环执行顺序的误解,我们一步步拆解执行流程:
C语言中for(表达式1; 表达式2; 表达式3)的严格执行顺序是:
- 仅执行一次表达式1:完成初始化操作,这里调用
fun(),返回10(此时n变为9),这个返回值会被直接忽略,因为表达式1不需要参与条件判断。 - 执行表达式2:作为循环的入口条件,这里调用
fun(),返回9(n变为8)。由于返回值非0,进入循环体。 - 执行循环体:也就是
printf("%d\n", fun());,这里调用fun(),返回8(n变为7),所以printf输出的是8——这就是你看到的实际结果。 - 执行表达式3:完成循环后的增量操作,这里调用
fun(),返回7(n变为6)。 - 回到步骤2,再次执行表达式2判断是否继续循环,直到表达式2返回0时终止。
你之前误以为表达式3会在循环体之前执行,或者错误关联了各fun()调用的返回值对应关系,但实际上循环体的执行早于表达式3,所以printf调用fun()时拿到的是表达式2执行后n递减一次的值,也就是8。
内容的提问来源于stack exchange,提问作者bharath2438
相关产品推荐
相关产品推荐

