#include <stdio.h>
int x;   // グローバル変数（自動ではなく静的領域に置かれ、0で初期化）

void mondai1(int b){
    x = b;   // グローバル x に b を代入
}

void mondai2(void){
    static int c = 10;  // 静的変数（初回だけ10で初期化され、値が保持される）
    x = c;              // グローバル x に c を代入
    c++;                // c をインクリメント（次回呼び出しに影響）
}

int mondai3(int d){
    x++;   // グローバル x をインクリメント
    d++;   // ローカル変数 d をインクリメント
    return d;  // d の新しい値を返す
}

int main(void) {

    // 1回目：グローバル x は 0 で初期化される（GA）
    printf("x = %d [GA: グローバル変数はプログラム開始時に0で初期化される]\n", x);

    // 2回目：mainで x = 101 を代入（GA）
    x = 101;
    printf("x = %d [GA: main関数内でグローバルxに101を代入した]\n", x);

    // 3回目：mondai1(102) により x = 102（GA）
    mondai1(102);
    printf("x = %d [GA: mondai1が呼ばれ、引数102をそのままグローバルxへ代入した]\n", x);

    // 4回目：mondai2 を3回呼ぶ → static c が 10→11→12→13 と変化
    mondai2();  // x = 10
    mondai2();  // x = 11
    mondai2();  // x = 12
    printf("x = %d [GS: mondai2内のstatic変数cが10→11→12→13と変化し、最後に12がxへ代入された]\n", x);

    // 5回目：for文内のローカル変数 x（LA）
    for (int i = 103; i < 104; i++) {
        int x = i;  // ローカル x が宣言され、グローバル x を隠す
        printf("x = %d [LA: for文内でローカル変数xが宣言され、i(103)が代入された。グローバルxは隠れている]\n", x);

        // 6回目：mondai3 によりローカル x に戻り値 104 を代入（LA）
        x = mondai3(i);
        printf("x = %d [LA: mondai3でグローバルxが++され13になり、戻り値104がローカルxへ代入された]\n", x);
    }

    // 7回目：グローバル x は mondai3 により 12→13（GA）
    printf("x = %d [GA: for文内のmondai3呼び出しでグローバルxが12→13にインクリメントされた]\n", x);

    return 0;
}

