int fact(int n) { if(n <= 1) { return 1; } else { int pre = fact(n - 1); int result = n * pre; return result; } } int main(int argc, char** argv) { int result = fact(10); printf("fact(10) = %d\n", result); return 0; }さて、gdb でプログラムをしばらく step 実行してみましょう。 で、呼び出し関係が深くなったところで、スタックを眺めると例えばこんな感じです。
当然と言えば当然なんですが、 n, pre, result といった局所変数は、 各関数呼出しのフレーム毎に存在します。 C では、関数呼び出しの際は、その値がコピーされ、呼び出された関数の引数(局所変数でもある)として扱われます。 だから、各関数の n は違う値なのです。
これも、必ず debugger で、実行の様子や、関数の呼び出し関係、局所変数の関係を確認しましょう。
2001.11.04/ Tomio KAMADA: kamada@cs.kobe-u.ac.jp