2017-04-17 18 views
2

静的変数の例誰もがこのプログラムの出力再帰関数で

#include <stdio.h> 
    int main() 
    { 
     static int i=10; 
     if(--i) 
     { 
      main(); /*recursive call main */ 
      printf("%d ", ++i); /* print returned value of main */ 

     } 
    } 
+0

になりますあなたが予想される出力は何か、あなたが持っているものの問題について教えてください?実際の出力は何ですか?そして、[良い質問をする方法を読む](http://stackoverflow.com/help/how-to-ask)に時間をかけてください。 –

答えて

0

++iを説明することができますことは、あなたが

printd("%d ", ++i); 

を書くとき、その値は同じままので、あなたは再びiをインクリメントi = i + 1と同じです。

1

static変数は一度初期化されます。そしてその生涯はプログラムのものです。変数が一度初期化されると、初期値は10になります。

すべての再帰呼び出しでは(ifステートメントで)デクリメントされ、0に達するとそれ以上は再発しません。

最後の再帰の後、印刷が開始され、リターンします。 printf文が再帰の後にある

として、それが最後の再帰後の最初の印刷を開始します(ときi=1)と1 printfを実行して戻しながら9

に、それが故に1でiを増やし続ける印刷され、一番上の関数スタックはiを9とします。

1

iは0と等しくないが、関数mainはそれ自身を呼び出します。

if(--i) 
    { 
     main(); /*recursive call main */ 

iがゼロに等しいその後、再帰が停止し、それぞれがメインの前の呼び出しにコントロールメインリターンと呼ばれるときに、あなたは通話

main(i = 10) -> main(i = 9) ->...-> main(i = 0) 

のチェーンを持っています。

メインの前の呼び出しだけ

printf("%d ", ++i); /* print returned value of main */ 

この文を実行したがって、出力は

1 2 3 4 5 6 7 8 9 
+0

'' 1 2 3 4 5 6 7 8 9' ... –

+0

https://ideone.com/vzZhOl –

+0

@AlexLopを印刷することは間違いありません。ありがとう。あなたが正しいです。 –

関連する問題