在c编程中覆盖寄存器int失败

时间:2012-10-11 16:40:11

标签: c memory int

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

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

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

为什么a的值不会被覆盖?输出显示10

2 个答案:

答案 0 :(得分:1)

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

尝试以下方法:

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

答案 1 :(得分: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的那个)被称为 shadow 另一个局部变量。如果需要,您可以创建任意数量的嵌套。例如,下一个程序:

#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.