为什么输出是0000以及如何?

我执行了这个程序,无法理解为什么输出为“0”四次。 任何人都可以帮我理解它的工作原理吗? 我不明白为什么“printf”在条件失败时执行以及为什么执行四次。

int main() { static int i=5; if(--i) { main(); printf("%d ",i); } } 

您的main函数打印4次0,因为printf语句在递归调用之后发生,并且i是静态变量。 静态变量只初始化一次,并且在函数终止后不会被销毁,因为它没有被分配到函数堆栈中。
结果, printf使用的i的值总是为0,因为每次调用main i递减,并且在最深函数返回后执行第一个printf函数,因为i=0

为了更好地理解这个解决方案,让我们看一下堆栈调用:

 main() i=5 (First call) if(4) // True main() (Second call) if(3) // True main() (Third call) if(2) // True main() (Forth call) if(1) // True main() (Fifth call) if(0) //False End recursion No print because the condition is false return print(i) // 0 (Forth Call) print(i) // 0 (Third call) printf(i) // 0 (Second call) print(i) // 0 (First call) 

main被调用5次,但应用程序打印4个零,因为最后一次调用不会打印任何内容,因为if条件为false。

i静态的,所以它只被初始化一次。 每当你调用main它会在i == 1时递减,那么` if语句条件在这里将为false

 if(--i) 

递归将停止, i将为0 ,然后递归将展开,程序将打印四个0秒。

为完整起见,C99标准草案第6.2.4对象3段的储存期限说明( 强调我的 ):

标识符使用外部或内部链接声明的对象,或者使用存储类说明符static声明的对象具有静态存储持续时间。 它的生命周期是程序的整个执行,它的存储值只在程序启动之前初始化一次