我發現了一個奇怪的錯誤(如果這實際上是一個錯誤)。您可以稍後在同一範圍內重新聲明一個變量,而您已經可以使用第一個相同的命名變量。這是正常的嗎?允許重新申報嗎?
此代碼編譯和工作沒有任何錯誤/警告。我正在使用代碼塊編譯g ++。
int main()
{
int test = 0;
if(1)
int test = 0;
return 0;
}
我發現了一個奇怪的錯誤(如果這實際上是一個錯誤)。您可以稍後在同一範圍內重新聲明一個變量,而您已經可以使用第一個相同的命名變量。這是正常的嗎?允許重新申報嗎?
此代碼編譯和工作沒有任何錯誤/警告。我正在使用代碼塊編譯g ++。
int main()
{
int test = 0;
if(1)
int test = 0;
return 0;
}
此代碼:
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;
}
是的我知道了,但是你仍然可以訪問第一個變量,而第二個變量被重新聲明... – Neox
@Neox查看我的編輯 –
它們不在同一個範圍內。您沒有在單個語句(而不是複合語句)周圍放置花括號statement_true並不意味着if
不會創建新的作用域。
嗯,我知道如果你不放大括號,只讀下一行彷彿有大括號。我無法理解的是沒有警告的重新宣佈。但無論如何,我得到了我的答案。謝謝。 – Neox
請嘗試以下方法看到if
創造了一個新的範圍:
int main()
{
int test = 0;
if(1)
int test = 1;
cout << test;
return 0;
}
因此,這是不是一個錯誤,這是每specification
該標準允許相同命名變量存在於不同的作用域中,並且它定義了在作用域內使用它們時將引用哪個變量的規則。相同的命名變量會隱藏(遮蔽)更高級別作用域中的變量。
這不是一樣的範圍。範圍不是簡單的「數」和「}」。 – hvd
噢,我的不好。但這是正常的嗎?這根本不是問題,還是它?我的意思是,如果你在另一個函數中聲明它們,我可以理解,但在這裏,你仍然可以訪問第一個變量。如何以及爲什麼這是允許的? – Neox
是的。這是正常的。 – Heto