これは基本的な再帰呼び出しです。
n
まず、 50 未満の値の場合、関数はn
2 回出力され、それ以外の値の場合は 1 回だけ出力されることに注意してくださいn
。それはあなたの出力と一致するので、ここで理解する唯一のことは順序です...
2つ目の s の間で再帰呼び出しを行うため、 for の出力は( for )からの出力の 1 行目と 2 行目の間にあることに注意してn*2
ください。まあ、それはあなたの出力とも一致します。n
n < 50
printf
これは予想通りです。
スタックについてインターネットで見つけた部分は、呼び出しスタックを参照しています。関数から戻るために、プログラムは関数が呼び出されたときの場所を追跡する必要があります。この情報は、「呼び出しスタック」または「実行スタック」と呼ばれるメモリの特別な部分の「最後」に書き込まれます。そしてそれはスタックから取り除かれます(つまり、関数が戻るときに「終了」が移動されます)。呼び出しパラメーターもスタックに記録されます。
この種のスタッキングは、再帰に不可欠です。
したがって、プログラムを呼び出すとnewfunc(2)
、5 行目にあることが記録され、8 行目の先頭にジャンプしnewfunc
ます。スタックは (概念的に) 次のようになります。
line 5, n=2
13行目に到達すると、新しい関数が再度呼び出され、スタックが作成されます
line 5, n=2; line 13, n=4
スタックが次のようになるまで、これが数回続きます。
line 5, n=2; line 13, n=4; line 13, n=8; line 13, n=16; line 13, n=32; line 13, n=64
if が失敗しnewfunc
、スタックをポップして戻り、13 行目以降に実行を再開するとき (これがスタックから取得したものであるため) スタックを作成する
line 5, n=2; line 13, n=4; line 13, n=8; line 13, n=16; line 13, n=32
スタックprintf
が
line 5, n=2; line 13, n=4; line 13, n=8; line 13, n=16;
など、コール スタック全体を巻き戻します。
いくつかの最終的な詳細: スタックは概念的に「上に」成長するため、しばしば次のように記述します。
line 13, n=32
line 13, n=16
line 13, n=8
line 13, n=4
line 5, n=2
スタックの内容の正確な形式は、チップのアーキテクチャと、OS プログラマーによって行われたいくつかの決定に依存します。
ところで--acプログラムは通常、「どこに」を示すために行番号を使用しません。これは、cでは行が適切な尺度ではないためです(私が十分に愚かであれば、プログラム全体を1行で書くことができます)、代わりに値を使用しますチップ上のレジスタの一部ですが、ここでの説明にはあまり影響しません。