fork download
  1. #include <stdio.h>
  2. int x; // グローバル変数(自動ではなく静的領域に置かれ、0で初期化)
  3.  
  4. void mondai1(int b){
  5. x = b; // グローバル x に b を代入
  6. }
  7.  
  8. void mondai2(void){
  9. static int c = 10; // 静的変数(初回だけ10で初期化され、値が保持される)
  10. x = c; // グローバル x に c を代入
  11. c++; // c をインクリメント(次回呼び出しに影響)
  12. }
  13.  
  14. int mondai3(int d){
  15. x++; // グローバル x をインクリメント
  16. d++; // ローカル変数 d をインクリメント
  17. return d; // d の新しい値を返す
  18. }
  19.  
  20. int main(void) {
  21.  
  22. // 1回目:グローバル x は 0 で初期化される(GA)
  23. printf("x = %d [GA: グローバル変数はプログラム開始時に0で初期化される]\n", x);
  24.  
  25. // 2回目:mainで x = 101 を代入(GA)
  26. x = 101;
  27. printf("x = %d [GA: main関数内でグローバルxに101を代入した]\n", x);
  28.  
  29. // 3回目:mondai1(102) により x = 102(GA)
  30. mondai1(102);
  31. printf("x = %d [GA: mondai1が呼ばれ、引数102をそのままグローバルxへ代入した]\n", x);
  32.  
  33. // 4回目:mondai2 を3回呼ぶ → static c が 10→11→12→13 と変化
  34. mondai2(); // x = 10
  35. mondai2(); // x = 11
  36. mondai2(); // x = 12
  37. printf("x = %d [GS: mondai2内のstatic変数cが10→11→12→13と変化し、最後に12がxへ代入された]\n", x);
  38.  
  39. // 5回目:for文内のローカル変数 x(LA)
  40. for (int i = 103; i < 104; i++) {
  41. int x = i; // ローカル x が宣言され、グローバル x を隠す
  42. printf("x = %d [LA: for文内でローカル変数xが宣言され、i(103)が代入された。グローバルxは隠れている]\n", x);
  43.  
  44. // 6回目:mondai3 によりローカル x に戻り値 104 を代入(LA)
  45. x = mondai3(i);
  46. printf("x = %d [LA: mondai3でグローバルxが++され13になり、戻り値104がローカルxへ代入された]\n", x);
  47. }
  48.  
  49. // 7回目:グローバル x は mondai3 により 12→13(GA)
  50. printf("x = %d [GA: for文内のmondai3呼び出しでグローバルxが12→13にインクリメントされた]\n", x);
  51.  
  52. return 0;
  53. }
  54.  
  55.  
Success #stdin #stdout 0s 5316KB
stdin
Standard input is empty
stdout
x = 0 [GA: グローバル変数はプログラム開始時に0で初期化される]
x = 101 [GA: main関数内でグローバルxに101を代入した]
x = 102 [GA: mondai1が呼ばれ、引数102をそのままグローバルxへ代入した]
x = 12 [GS: mondai2内のstatic変数cが10→11→12→13と変化し、最後に12がxへ代入された]
x = 103 [LA: for文内でローカル変数xが宣言され、i(103)が代入された。グローバルxは隠れている]
x = 104 [LA: mondai3でグローバルxが++され13になり、戻り値104がローカルxへ代入された]
x = 13 [GA: for文内のmondai3呼び出しでグローバルxが12→13にインクリメントされた]