You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 08:01:40