次のC言語プログラムを2回実行することを考える。
#include <stdio.h>
void n (int c)
{
if(c==0) return;
ア
n(--c);
イ
}
int main(void)
{
n(10);
putchar('\n');
return 0;
}
プログラム片 printf("%d ", c); を、1回目は空欄 ア のみに挿入して実行し、2回目は空欄 イ のみに挿入して実行する。1回目と2回目で表示はどのようになるか。次のうち、適切なものはどれか。
@ 表示は変わらない。
A 1回目: 1 2 3 4 5 6 7 8 9 10
2回目: 9 8 7 6 5 4 3 2 1 0
B 1回目: 10 9 8 7 6 5 4 3 2 1
2回目: 0 1 2 3 4 5 6 7 8 9
C 1回目: 1 2 3 4 5 6 7 8 9 10
2回目: 10 9 8 7 6 5 4 3 2 1
D 1回目: 10 9 8 7 6 5 4 3 2 1
2回目: 1 2 3 4 5 6 7 8 9 10
B
n(--c) は cから1を引いた値を引数に渡す。
n(c--) は cを引数として渡してから、戻ってきたときに1を引く。
トレースすると次のようになる。
【1回目】
n(10); ・・・10を引数として関数nを呼出す。
if(c==0) ・・・ c = 10だから次のステップへ。
printf("%d ", 10); ・・・10 を出力
n(--10) ・・・9を引数として関数nを呼出す。
if(c==0) ・・・ c = 9だから次のステップへ。
printf("%d ", 9); ・・・9 を出力
n(--9) ・・・8を引数として関数nを呼び出す。
if(c==0) ・・・ c = 8だから次のステップへ。
・・・
printf("%d ", 1); ・・・1 を出力
n(--1) ・・・0を引数として関数nを呼出す。
if(c==0) ・・・ c = 0だからreturn。
putchar('\n');
return 0;
よって1回目は 10 9 8 7 6 5 4 3 2 1 を表示する。
【2回目】
n(10); ・・・10を引数として関数nを呼出す。
if(c==0) ・・・ c = 10だから次のステップへ。
n(--10) ・・・9を引数として関数nを呼出す。
if(c==0) ・・・ c = 9だから次のステップへ。
n(--9) ・・・8を引数として関数nを呼出す。
・・・
n(--2) ・・・1を引数として関数nを呼出す。
if(c==0) ・・・ c = 1だから次のステップへ。
n(--1) ・・・0を引数として関数nを呼出す。
if(c==0) ・・・ c = 0だからreturn。
printf("%d ", 0); ・・・0 を出力
printf("%d ", 0); ・・・1 を出力
・・・
printf("%d ", 8); ・・・8 を出力
printf("%d ", 9); ・・・9 を出力
putchar('\n');
return 0;
よって2回目は 0 1 2 3 4 5 6 7 8 9 を表示する。
目次 | V−2 |