for循环初始化、条件、更新阶段使用自减运算符的问题
C语言for循环执行逻辑解析
原代码如下:
int a=9; for(a--;a--;a--) printf("%d\n",a);
实际输出:
7 5 3 1
为什么不会无限循环?
核心是明确C语言for循环的固定执行顺序:
- 仅执行一次初始化表达式(
for括号内第一个部分) - 计算条件表达式(第二个部分):结果为非0则进入循环体,为0直接终止循环
- 执行循环体代码
- 执行增量表达式(第三个部分),回到步骤2重复判断
逐轮拆解执行过程:
- 初始状态:
a = 9 - 初始化阶段:执行
a--,a变为8(此步骤只运行一次) - 第一次循环:
- 条件判断:执行
a--,先判断当前a=8为非0(条件成立),随后a自减为7 - 执行循环体,打印
7 - 执行增量表达式
a--,a变为6
- 条件判断:执行
- 第二次循环:
- 条件判断:执行
a--,判断当前a=6为非0,随后a自减为5 - 打印
5 - 执行增量
a--,a变为4
- 条件判断:执行
- 第三次循环:
- 条件判断:执行
a--,判断当前a=4为非0,随后a自减为3 - 打印
3 - 执行增量
a--,a变为2
- 条件判断:执行
- 第四次循环:
- 条件判断:执行
a--,判断当前a=2为非0,随后a自减为1 - 打印
1 - 执行增量
a--,a变为0
- 条件判断:执行
- 循环终止:
- 再次执行条件判断
a--,当前a=0,判断结果为假,循环直接终止(此时a会自减为-1,但循环体不再执行)
- 再次执行条件判断
可见循环的条件表达式最终会得到0,触发终止逻辑,因此不会无限循环。
内容的提问来源于stack exchange,提问作者Priyanuj Bora
相关产品推荐
相关产品推荐

