#include <stdio.h>

// globals (initialized to 0)
int a, b, c, d;

void g1(int b, int c) {
    // free a,d refer to globals
    printf("%d %d %d %d\n", a, b, c, d);
}

void g2(int a_, int c_) {
    // parameters renamed so we don’t shadow globals
    g1(a_, c_);
}

int g3(int c_, int a_) {
    int b_ = 3;
    g1(a_, b_);

    {   // inner block with its own c,d
        int c = 8;
        int d = 4;
        g2(a_, b_);
    }

    g1(a_, b_);
    return b_;
}

int main(void) {
    int a = 4, b = 5;   // locals shadow globals inside main
    // first call: a=4 (local), b=5 (local), global c==0
    a = g3(b, c);
    // second call: b (local)==5, a (local)==3
    g3(b, a);
    return 0;
}
