关于while循环表达式等价性的疑问:i>0为真时两段代码为何等价?
为啥这两段while循环在i>0时等价?
嘿,这个问题问到点子上了,核心就藏在后置递减运算符i--的执行逻辑里,咱们结合具体例子拆解就一目了然了:
先看第一段代码的执行流程
while(i > 0) { printf("Hello \n"); i--; };
这段逻辑很直白:
- 每次进入循环前,先判断
i > 0是否成立 - 如果成立,就执行打印操作,然后把
i减1 - 直到
i变成0,i>0不成立,循环终止 - 循环结束后,
i的值是0
再看第二段代码的关键细节
while(i--) { printf("Hello \n"); };
这里的i--是后置递减运算符,它的执行顺序是:
- 先返回
i当前的原始值,用这个值作为循环条件的判断依据(C语言里非0即为真,0为假) - 完成判断后,再把
i的值减1
因为题目已经明确初始i > 0,咱们拿初始i=3来举例子对比:
| 循环轮次 | 第一段代码(i>0) | 第二段代码(i--) |
|---|---|---|
| 第1轮 | 判断3>0→真,打印,i变2 | 返回3→真,打印,i变2 |
| 第2轮 | 判断2>0→真,打印,i变1 | 返回2→真,打印,i变1 |
| 第3轮 | 判断1>0→真,打印,i变0 | 返回1→真,打印,i变0 |
| 第4轮 | 判断0>0→假,循环终止 | 返回0→假,循环终止 |
你看,两轮循环的打印次数完全一致,都是执行了初始i值的次数。唯一的区别是循环结束后i的值:第一段结束后i=0,第二段结束后i=-1,但如果只看循环体(打印操作)的执行效果,两者是完全等价的——这也是题目里“等价”的核心含义。
简单总结:初始i>0时,两段循环都会执行i初始值次数的打印,因为第二段的i--在每次循环时,先用原始值判断(等价于第一段的i>0判断,因为原始值是正的),然后再减1,和第一段循环里“打印后减1”的最终效果(循环体执行次数)完全一致。
内容的提问来源于stack exchange,提问作者Tolis M.
相关产品推荐
相关产品推荐

