C语言中if(a--)与if(--a)的执行差异及输出疑问
解析static变量配合自减运算符的输出差异
情况1:使用后置自减a--的代码与输出
#include <stdio.h> int main(){ static int a = 9; if (a--){ printf("after decrement a =%d\n", a); main(); } return 0; }
输出:
after decrement a =8 after decrement a =7 after decrement a =6 after decrement a =5 after decrement a =4 after decrement a =3 after decrement a =2 after decrement a =1 after decrement a =0
此输出打印至a=0
情况2:使用前置自减--a的代码与输出
修改条件为if(--a)后,代码如下:
#include <stdio.h> int main(){ static int a = 9; if (--a){ printf("after decrement a =%d\n", a); main(); } return 0; }
输出:
after decrement a =8 after decrement a =7 after decrement a =6 after decrement a =5 after decrement a =4 after decrement a =3 after decrement a =2 after decrement a =1
此输出打印至a=1
疑问
使用if(a--)时输出打印至a=0,使用if(--a)时打印至a=1,且使用前置自减时输出为何从8开始而非9?
原因解析
首先明确:static修饰的局部变量只会初始化一次,每次递归调用main时,不会重新给a赋值为9,而是保留上一次修改后的数值。
1. 后置自减a--的执行逻辑
后置自减是先判断,再减1:
- 第一次进入
main,a初始值为9,if(a--)用9作为判断条件(非0,条件成立),之后a被减到8,执行printf输出8,再递归调用main。 - 后续每次递归,重复“用当前
a值判断→减1→输出减后的值→递归”的流程,直到a为1时:if(a--)用1判断(成立),a减到0,输出0;下一次递归时,a为0,if(a--)用0判断(不成立),不再执行输出和递归,程序开始回溯返回。所以最终输出到a=0。
2. 前置自减--a的执行逻辑
前置自减是先减1,再判断:
- 第一次进入
main,a初始值为9,--a先把a减到8,再用8作为判断条件(非0,成立),执行printf输出8,再递归调用main。 - 后续每次递归,重复“减1→用减后的值判断→输出→递归”的流程,直到
a为2时:--a减到1,用1判断(成立),输出1;下一次递归时,a为1,--a减到0,用0判断(不成立),不再执行输出和递归。所以输出只会到a=1,且第一次输出就是8,因为判断前已经完成了自减操作。
内容的提问来源于stack exchange,提问作者Syed
相关产品推荐
相关产品推荐

