该程序如何执行?

时间:2018-12-15 18:57:01

标签: c recursion static

#include <stdlib.h> 
#include <stdio.h> 
int main() 
{ 
    static int i = 5; 
    if(--i){ 
        main(); 
        printf("%d ",i); 
    }
    return 0;
}

上面的代码的输出是0 0 00。我首先知道为什么它是0,但是为什么0又打印了三遍?

5 个答案:

答案 0 :(得分:3)

回想一下,import csv pf = open("yourcsv.csv", "r") read = csv.reader(pf) male_count = 0 for r in read: if r[1] == 'Male': male_count += 1 pf.close() print("Male count: {}".format(male_count)) 变量在所有对static的调用之间共享。然后考虑递归执行的代码:

main

答案 1 :(得分:1)

症结在于,由于istatic,因此所有内容都设置了相同的i变量。并且main递归调用自身,直到i是一个伪造的值。

int main() 
{ 
  static int i = 5; 
  if(--i){ // i is now 4
    main(); 
      { 
        if(--i){ // i is now 3
          main(); 
            { 
              if(--i){ // i is now 2
                main(); 
                  { 
                    if(--i){ // i is now 1
                     main(); 
                        { 
                          if(--i){ // i is now 0, which is false, so main isn't called
                          }
                        }
                      printf("%d ",i); //print "0"
                   }
                 }
                printf("%d ",i);  //print "0"
             }
           }
          printf("%d ",i);  //print "0"
        }
      }
    printf("%d ",i);  //print "0"
  }
  return 0;
}

答案 2 :(得分:0)

变量i是静态的。因此,在程序第一次到达第5行时变量就获得了值,而第5行不再执行了。并且由于变量i是静态的,因此每次执行main时,它都会访问之前访问过的相同i。并且如果任何函数调用更改了i的值,则其他函数调用中的值也会更改。因此,虽然i的值不是0,但调用了主函数,并且当其值等于0时,主函数返回并且printf()开始执行和打印i,即0

答案 3 :(得分:0)

像这样

static int i = 5
if (--i) //i == 4{
  if (--i) //i == 3{
    if(--i) // i ==2{ 
      if (--i) // i==1{
        if (--i) //i==0 this means i==false{
        }
        print (i) //i ==0
      }
      print(i) //i ==0
    }
    print(i) //i==0
  }
  print(i) //i==0
return 0

这是执行代码时发生的情况, 4个递归调用,一旦调用结束,它将打印变量i,该变量是静态的,因此对于所有调用,它实际上是相同的。

为什么要打印4张而不是5张?

因为-用作前缀是这样的

i = i-1
if (i)

用作-后缀的

if (i)
i = i-1

答案 4 :(得分:0)

当我被声明为function autoScroll(){ console.log("running") } // save a reference to the interval handle let interval = window.setInterval(autoScroll, 100); // cancel interval after 1 second (1000 ms) setTimeout(() => clearInterval(interval), 1000)时,它将在static上(如果删除静态变量,它将在堆栈上,并且在每个堆栈帧中将具有不同的值,但是这里i = 5每次在启动时都会初始化如果删除data segment,则程序将进入无限函数调用循环,因为static永远不会为零,因此递归不会终止)

,由于ii,因此您所做的任何更改都将保留在函数调用中。 当static达到零时,递归以i变为false结束,当它转弯时,返回时将打印最终值i,即零