ID非公開さん
2022/1/17 1:24
2回答
このプログラムを出力した結果のin main4,5,6がなぜ10,2,2になるのかわからないので解説お願いします。 #include <stdio.h> int a=1, b=2, c=3;
このプログラムを出力した結果のin main4,5,6がなぜ10,2,2になるのかわからないので解説お願いします。 #include <stdio.h> int a=1, b=2, c=3; int func1(int,int); int func2(int); main() { int a=4, c=5; printf("in main1 a = %d\n",a); printf("in main1 b = %d\n",b); printf("in main1 c = %d\n",c); { int a=6, b=7; printf("in main2 a = %d\n",a); printf("in main2 b = %d\n",b); printf("in main2 c = %d\n",c); } a = func1(b,c); printf("in main3 a = %d\n",a); printf("in main3 b = %d\n",b); printf("in main3 c = %d\n",c); printf("in main4 a = %d\n",func2(a)); printf("in main5 b = %d\n",func2(b)); printf("in main6 c = %d\n",func2(c)); printf("in main7 a = %d\n",a); printf("in main7 b = %d\n",b); printf("in main7 c = %d\n",c); } int func1(int a,int b) { int c=8; printf("in func1 a = %d\n",a); printf("in func1 b = %d\n",b); printf("in func1 c = %d\n",c); return a*b; } int func2(int x) { static int b, c=0; if(c == 0) b=x; else if(x<b) b=x; c++; return b; } 出力結果 in main1 a = 4 in main1 b = 2 in main1 c = 5 in main2 a = 6 in main2 b = 7 in main2 c = 5 in func1 a = 2 in func1 b = 5 in func1 c = 8 in main3 a = 10 in main3 b = 2 in main3 c = 5 in main4 a = 10 in main5 b = 2 in main6 c = 2 in main7 a = 10 in main7 b = 2 in main7 c = 5
ベストアンサー
複雑なプログラムなので、一つづつ見ていくといいと思います。 このプログラムは、同じ名前の変数があちこちで使われていることが、プログラムを複雑にしている原因です。なので、プログラムをさかのぼりながら、一番最初に出会ったa,b,cの変数の値が何なのかを見ていけばいいと思います。 printf("in main4 a = %d\n",func2(a)); printf("in main5 b = %d\n",func2(b)); printf("in main6 c = %d\n",func2(c)); この関数からプログラムをさかのぼって、最初に出会うa,b,cを見ていきます。 まず、a = func1(b,c);に出会います。つまり、aはfunc1の関数の戻り値です。次に、func1の引数のb,cの値が何であるかをさかのぼってみていきます。 (a = func1(b,c)) 次に、int a=6, b=7;と出会います。ですが、これは{}の中にあるので、{}の外で使われているfunc1の引数のbとは異なっています。よって、これは無視します。 次に、int a=4, c=5;と出会います。よって、cは5です。 (c = 5) 最後に、int a=1, b=2, c=3;と出会います。ここで初めてbが出てきたので、bは2です。 (b = 2) b = 2, c = 5であることが分かったので、func1を見ていきます。func1はb * cを返すので、a = b * c = 2 * 5 = 10です。 (a = 10) これでようやくa,b,cがそろったので、func2を見ていきます。 int func2(int x) { static int b, c=0; if(c == 0) b=x; else if(x<b) b=x; c++; return b; } (a = 10, b = 2, c = 5) まず、func2(a)から見ていきます。 if(c==0)をみたすので、b = a = 10です。 c++ で c が1になります。staticは関数を出た後も値を持ち続けるので、次にこの関数に入ったときはcは0ではなく1になります。bも同様に0ではなく10になっています。 return bなので10が返されて、 printf("in main4 a = %d\n",func2(a)); は10になります。 つぎに、func2(b)を見ていきます。 cは1になっていますのでelse if(x<b) b=x;を見ます。 xは2、bは10になっていますので、このif文は条件を満たします。 よって、b = x = 2になります。 c++ でcは2になります。 return b より、2が返されて、 printf("in main5 b = %d\n",func2(b)); は2になります。 最後に、func2(c)を見ます。 前と同様、cは2になっているので、else if(x<b) b=x;を見ます。 xは5、bは2になっていますので、このif文は条件を満たしません。よって無視されます。 b = 2より、2が返されて、 printf("in main6 c = %d\n",func2(c)); は2になります。
質問者からのお礼コメント
ありがとうございました!
お礼日時:1/17 2:28