C语言特殊for循环代码运行逻辑与输出现象疑问
C语言for循环代码执行逻辑答疑
首先贴出你给出的代码段:
#include <stdio.h> int main(){ for (printf ("3"); printf("2"); printf("1")) break; return 0; }
前置知识点
- C语言
for循环的执行顺序固定为:- 循环启动时执行一次表达式1,后续循环不再重复执行
- 执行表达式2,若返回值为非0(逻辑真)则进入循环体,若为0(逻辑假)直接结束循环
- 循环体执行完成后,执行表达式3,随后回到上一步重复判断表达式2的结果
printf函数的返回值为成功打印的字符数量,本示例中printf("3")、printf("2")、printf("1")的返回值均为1,对应逻辑真。
带break的原代码执行逻辑
按照规则逐步骤执行:
- 首先执行表达式1:
printf("3"),输出字符3,这一步仅执行一次 - 执行表达式2:
printf("2"),输出字符2,返回值为1(真),进入循环体 - 循环体内容为
break;,直接终止整个for循环,后续的表达式3不会执行,也不会再次进入循环判断
所以最终输出结果为32,和观测结果一致。
删除break后的无限循环原理
删除break后,for循环的循环体为空语句,执行流程变为:
- 初始执行表达式1:
printf("3"),输出3,仅执行一次 - 执行表达式2:
printf("2"),输出2,返回1(真),执行空循环体(无任何操作) - 执行表达式3:
printf("1"),输出1 - 回到步骤2,重复执行表达式2、空循环体、表达式3
由于printf("2")永远返回1,表达式2永远为真,循环没有终止条件,因此会进入无限循环。开头的3仅输出一次后,后续循环会持续交替输出2和1,因此观测到的持续输出内容为1和2的循环序列,也就是你提到的输出为12的现象。
内容的提问来源于stack exchange,提问作者Navi
相关产品推荐
相关产品推荐

