在C中,是在循环中声明的变量,本地?

har*_*der 7 c loops local-variables

    #include <stdio.h>

    int a;

    void myproc()
    {
        int a = 2;
        while (a == 2)
        {
            int a = 3;
            printf("a = %d\t", a);
            break;
        }
        printf("a = %d\t", a);
    }

    int main()
    {
        a = 1;
        myproc();
        printf("a = %d\t", a);
        return (0);
    }
Run Code Online (Sandbox Code Playgroud)

我期望上面的代码打印:a = 3 a = 3 a = 1然而,它打印:a = 3 a = 2 a = 1有人可以提供有效的解释吗?

Jas*_*son 6

是的,它们是本地自动变量,当你进入和退出给定的范围时,它会被推入并弹出堆栈,除非编译器决定进行某些优化(例如将它们存储在寄存器中等).但是对于给定的变量,访问它时使用该变量的大多数本地范围版本.例如,在C89中,如果您决定在for循环声明中声明循环计数器,则以下通常会产生编译器错误:

for (int i=0; i < N; i++)
    for (int i=0; i < J; i++)
        printf("%d", i);
Run Code Online (Sandbox Code Playgroud)

print的值i将始终是i内部for循环中声明的值,因为这是本地范围最大的版本i.


Ed *_*eal 6

这是一个解释 - 见下面的评论.

#include <stdio.h>

int a;

void myproc()
{
    int a = 2; // (1) a = 2
    while (a == 2) // true
    {
        int a = 3;  // (2) new scope, new a = 3
        printf("a = %d\t", a); // (X) prints 3 as it gets the 'nearest a' in the scope
        break;
    } // throws away a=3 from (2)
    printf("a = %d\t", a); // (Y) Uses (1) i.e. 2 and print it 
}

int main()
{
    a = 1;
    myproc();
    printf("a = %d\t", a); // (Z) Just prints 1 as the scope is not effected by myproc
    return (0);
}
Run Code Online (Sandbox Code Playgroud)

所以这将打印(X)(Y)和(Z)

即3 2 1