#include <stdio.h>

int x; // 3行目: グローバル変数（初期化なしのため自動的に0）

void mondai1(int b) {
    x = b; // 6行目
}

void mondai2(void) {
    static int c = 10; // 10行目
    x = c;             // 11行目
    c++;               // 12行目
}

int mondai3(int d) {
    x++;      // 16行目: グローバル変数をインクリメント
    d++;      // 17行目
    return d; // 18行目
}

int main(void) {
    printf("x = %d [GS:3行目 初期値がないから0]\n", x);
    
    x = 101; // 23行目
    printf("x = %d [GS:23行目で101を代入したから101]\n", x);
    
    mondai1(102); // 26行目 (関数内: 6行目を実行)
    printf("x = %d [GS:26行目 mondai1(102)で6行目のx=bが実行され102]\n", x);
    
    mondai2(); // 29行目
    mondai2(); // 30行目
    mondai2(); // 31行目 (関数内: 10〜12行目を3回実行)
    printf("x = %d [GS:29〜31行目でmondai2が3回実行され 11行目でstatic変数cの12が代入されたから12]\n", x);
    
    for (int i = 103; i < 104; i++) { // 34行目
        int x = i; // 35行目: ローカル変数x（3行目のグローバル変数xをシャドーイング）
        printf("x = %d [LA:35行目でローカル変数xにi(103)を代入したから103]\n", x);
        
        x = mondai3(i); // 38行目 (関数内: 16〜18行目を実行)
        printf("x = %d [LA:38行目でmondai3(103)の戻り値104がローカル変数xに代入されたから104]\n", x);
    }
    
    printf("x = %d [GS:for文を抜け3行目のグローバル変数xを参照。38行目のmondai3実行時(16行目)で13に加算されたため13]\n", x);
    
    return 0;
}