while循环中使用三元运算符时i输出1而非0的原因是什么
#include<stdio.h> int main(){ int i=2,j=2; while(i+1?--i:j++) printf("%d",i); return 0; }
执行逻辑逐轮拆解
你产生这个疑惑的核心是混淆了「三目运算符的执行时机」和「循环体的触发规则」,跟着执行顺序走一遍就清楚了:
首先明确两个核心规则:
- 三目运算符
a?b:c的执行逻辑:先计算a的值,非0就执行b并返回b的结果,为0就执行c并返回c的结果 - while循环的规则:只有判断条件的结果非0时,才会进入循环体执行内部的
printf,条件为0直接终止循环,不会执行循环体内容。
第一轮循环判断(初始值i=2,j=2)
- 先算三目运算符的判断条件
i+1:2+1=3,非0,执行冒号左侧的--i - i自减1从2变成1,
--i的返回值是1,因此整个三目表达式的结果是1 - while判断结果为真,进入循环体,执行
printf输出i的值,也就是1
第二轮循环判断(当前i=1,j=2)
- 先算三目运算符的判断条件
i+1:1+1=2,非0,继续执行冒号左侧的--i - i自减1从1变成0,
--i的返回值是0,因此整个三目表达式的结果是0 - while判断结果为假,直接终止循环,不会进入循环体执行
printf
所以整个程序只会输出一次1,不会输出0,第二次的i自减是在循环条件判断阶段执行的,执行完直接触发了循环终止,没有机会把0打印出来。
内容的提问来源于stack exchange,提问作者synth
相关产品推荐
相关产品推荐

