C语言for循环三部分嵌入printf的运行逻辑及输出32原因问询
C语言代码运行逻辑解答
首先附上问题中的代码:
#include <stdio.h> int main() { int a=1; for (printf ("3"); printf ("2"); printf ("1")) return 0; }
输出为32的原因
这段代码的输出结果完全遵循C语言for循环的标准执行规则,以及printf函数的返回值特性,具体执行流程如下:
先明确两个基础规则
printf函数的返回值为成功打印到标准输出的字符个数,本题中打印单个字符的printf调用只要执行成功,返回值固定为1(非0,对应布尔真)。- C语言中如果
for后没有加花括号,仅将紧跟的第一条语句作为循环体,本题中循环体就是return 0;。
逐步骤执行拆解
for循环的通用执行顺序为:初始化语句(仅1次)→ 条件判断 → 循环体 → 更新语句 → 回到条件判断,循环往复,对应本题的执行过程:
- 第一步:执行初始化位置的
printf("3"),打印字符3,初始化语句仅执行这1次,返回值不会被for逻辑使用。 - 第二步:执行条件判断位置的
printf("2"),打印字符2,调用返回值为1(非0),判定循环条件成立,进入循环体。 - 第三步:执行循环体的
return 0;,直接终止main函数,程序运行结束。
更新位置的printf("1")根本没机会执行,所以不会输出1,最终输出的内容就是先后打印的3和2拼接的32。
for循环三个位置调用printf的运行原理
三个位置的执行逻辑可以对应通用规则理解:
- 初始化位置的
printf:仅在循环启动前执行1次,不管循环跑多少次,这段代码只会运行1次,返回值无特殊作用。 - 条件判断位置的
printf:每次要判断要不要进入下一轮循环前都会执行,for会拿这个表达式的返回值判断是否继续循环,返回非0就继续,返回0就跳出循环。 - 更新位置的
printf:只有当循环体正常执行完成(没有被return、break等跳转语句打断)后才会执行,执行完后会再次触发条件判断,进入下一轮循环的校验。
内容的提问来源于stack exchange,提问作者synth
相关产品推荐
相关产品推荐

