2012-10-11 41 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