Alcance léxico vs alcance dinámico

Así que tengo este problema donde tengo que averiguar la salida usando dos reglas de alcance diferentes. Sé que la salida utilizando el alcance léxico esa=3 yb=1, pero estoy teniendo dificultades para descifrar la salida utilizando el alcance dinámico.
Nota: el ejemplo de código que sigue utiliza la sintaxis de C, pero tratémoslo como un pseudocódigo.

int a,b;

int p() {
    int a, p;
    a = 0; b = 1; p = 2;
    return p;
}

void print() {
    printf("%d\n%d\n",a,b);
}

void q () {
    int b;
    a = 3; b = 4;
    print();
}

main() {
    a = p();
    q();
}

Aquí es lo que se me ocurre. Usando el alcance dinámico, las referencias no locales aa yb puede cambiar. Así que tengoa=2 (retorno de p ()), entoncesb=4 (dentro de q ()). Así que la salida es2 4?

Respuestas a la pregunta(2)

Su respuesta a la pregunta