-3

我想知道为什么寄存器整数的值a没有被覆盖:

#include <stdio.h>
#include <conio.h>

main()
{
    register int a=10;
    {
        register int a=30;
    }
    printf("%d",a);
    getch();
}

为什么没有a覆盖的值?输出显示10

4

2 回答 2

1

您在新范围内重新声明了一个变量。这两个 a:s 是不同的。

尝试以下操作:

int main()
{
    register int a=10;
    {
       a=30;
    }
    printf("%d",a);
    getch();
}
于 2012-10-11T16:41:33.853 回答
0

在你的函数中使用这些大括号会创建一个新的嵌套块。这意味着您的线路:

register int a=30;

正在声明一个也恰好被调用的新变量a。如果您添加另一个对 printf 的调用,您会看到这种情况发生(我稍微重写了您的程序以删除不必要的register关键字并清理了一些东西以使其成为标准 C):

#include <stdio.h>

int main(void)
{
    int a = 10;
    {
        int a = 30;
        printf("%d\n", a);
    }
    printf("%d\n", a);
    return 0;
  }

该程序的输出是:

30
10

内部a(设置为 的那个30)被称为遮蔽另一个局部变量。如果需要,您可以创建任意数量的嵌套。例如,下一个程序:

#include <stdio.h>

int main(void)
{
    int a = 10;
    {
        int a = 30;
        {
            int a = 40;
            printf("%d\n", a);
        }
        printf("%d\n", a);
    }
    printf("%d\n", a);
    return 0;
}

产生这个输出:

40
30
10

a隐藏当前范围/块之外的所有其他声明的重新声明。a所有这一切意味着您的原始程序在语义上等同于:

#include <stdio.h>

int main(void)
{
    int a = 10;
    printf("%d\n", a);
    return 0;
}

由于内部a已设置但从未使用过。事实上,打开一些警告标志可能会让编译器给出一些关于正在发生的事情的诊断消息。我clang在这里用过:

$ clang -Wunused-variable example.c -o example
example.c:7:9: warning: unused variable 'a' [-Wunused-variable]
    int a = 30;
        ^
1 warning generated.
于 2012-10-11T16:49:54.920 回答