2

我执行了这个程序,但无法理解为什么输出为“0”四次。谁能帮我理解它是如何工作的?我不明白为什么在条件失败时执行“printf”以及为什么它执行四次。

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

2 回答 2

3

您的 main 函数打印 4 次 0,因为 printf 语句发生在递归调用之后并且i是一个静态变量。静态变量只初始化一次,并且在函数终止后不会被销毁,因为它没有分配到函数堆栈中。
结果,所i使用的值printf始终为 0,因为i每次main调用都会递减,并且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) 

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

于 2013-10-30T19:27:28.810 回答
3

i静态的,所以它只初始化一次。每次调用main它时i == 1,` if语句条件将在此处为false时递减:

if(--i)

递归将停止并且i将是0,然后递归将展开并且程序将打印四个0s。

为了完整起见,C99 标准草案第3段6.2.4 对象的存储持续时间说(强调我的):

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

于 2013-10-30T19:27:39.830 回答