2016-06-07 69 views
1

我發現了一個奇怪的錯誤(如果這實際上是一個錯誤)。您可以稍後在同一範圍內重新聲明一個變量,而您已經可以使用第一個相同的命名變量。這是正常的嗎?允許重新申報嗎?

此代碼編譯和工作沒有任何錯誤/警告。我正在使用代碼塊編譯g ++。

int main() 
{ 
    int test = 0; 
    if(1) 
     int test = 0; 
    return 0; 
} 
+6

這不是一樣的範圍。範圍不是簡單的「數」和「}」。 – hvd

+0

噢,我的不好。但這是正常的嗎?這根本不是問題,還是它?我的意思是,如果你在另一個函數中聲明它們,我可以理解,但在這裏,你仍然可以訪問第一個變量。如何以及爲什麼這是允許的? – Neox

+1

是的。這是正常的。 – Heto

回答

2

此代碼:

if(1) 
    int test = 0; 

等於:

if(1){ 
    int test = 0; 
} 

所以它的作用範圍的一部分。並且if內部的test與範圍之外的不一樣。

您可以不是訪問外部test變量。

int main() 
{ 
    int test = 0; 
    if(1){ 
     int test = 5; 
     std::cout << "Inner:" << test<< "\n"; 
     //you can not access the outer test 
    } 
    return 0; 
} 
+0

是的我知道了,但是你仍然可以訪問第一個變量,而第二個變量被重新聲明... – Neox

+0

@Neox查看我的編輯 –

2

它們不在同一個範圍內。您沒有在單個語句(而不是複合語句)周圍放置花括號statement_true並不意味着if不會創建新的作用域。

參見:http://en.cppreference.com/w/cpp/language/if

+0

嗯,我知道如果你不放大括號,只讀下一行彷彿有大括號。我無法理解的是沒有警告的重新宣佈。但無論如何,我得到了我的答案。謝謝。 – Neox

1

請嘗試以下方法看到if創造了一個新的範圍:

int main() 
{ 
    int test = 0; 
    if(1) 
     int test = 1; 
    cout << test; 
    return 0; 
} 

因此,這是不是一個錯誤,這是每specification

1

該標準允許相同命名變量存在於不同的作用域中,並且它定義了在作用域內使用它們時將引用哪個變量的規則。相同的命名變量會隱藏(遮蔽)更高級別作用域中的變量。

L.E:Variable Shadowing