2012-10-11 39 views
-3

失败我想知道为什么注册整数a的值不会被覆盖:覆盖寄存器INT C编程

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

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

为什么不是a值改写?输出显示10

+0

我很感激您对编码和提问的热情,但请在提交语法和格式前仔细阅读您的文章。 “i”在参考自己时应该大写,并在代码中使用缩进(每个新范围4个空格是一个很好的经验法则)。否则就会让他们难以阅读。 – Mike

+0

好的..我得到那 –

回答

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当前范围/块外的重声明。什么这一切意味着,原来的计划是语义上等效于:由于内部a设置,但从未使用

#include <stdio.h> 

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

。事实上,打开一些警告标志可能会让编译器给出一些关于正在发生的事情的诊断消息。我在这里使用clang

$ clang -Wunused-variable example.c -o example 
example.c:7:9: warning: unused variable 'a' [-Wunused-variable] 
    int a = 30; 
     ^
1 warning generated. 
+0

好吧,我有那个兄弟...但有一个问题有行注册int a = 30; 它在代码中实际做了什么? –

+0

@WifuWifu,在你原来的程序中它什么都不做。它可能根本就不存在。 –

1

您重新声明新范围内的变量。这两个是不同的。

尝试以下操作:

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

如果没有新的范围要求,那些大括号是不必要的。我也会摆脱它们。 –

+0

请解释他们是如何不同? –

+0

@CarlNorum这些是OP理解问题所必需的。这个答案和问题仅仅是没有意义的**。 – 2012-10-11 16:44:59