2013-11-25 20 views
31

我在Visual Studio 2010中做C++,發現一些奇怪的行爲。爲了使長話短說,我發現,這不會編譯:C++重新聲明循環計數變量不一致的行爲?

for (int i = 0; i < 10; i++) 
{ 
    int i = 11; 
} 

這似乎是正確的,因爲變量i在已經申報循環頭。現在,如果我在重新聲明i之前插入另一個for循環,那麼編譯器,intellisense等會突然顯示代碼是正確的 - 沒有給出真正的警告(嘗試過警告級別3和4(/ W3和/ W4))。那麼,這樣做實際上將編譯和運行:

for (int i = 0; i < 10; i++) 
{ 
    for(int j = 0; j < 5; j++) 
    { 
    } 

    int i = 11; 
} 

就個人而言,我覺得很奇怪,insering另一個for循環的合法化,否則相同的代碼的情況。 任何一種精神都能告訴我我在這裏忽略了什麼?

在此先感謝!

編輯: 哇,謝謝大家的所有答覆和演示 - 你真棒! :) 這個揭露bug的例子確實讓我想起了,我只是假設MS現在已經注意到了這樣的事情並修復了它......至少在VS2013中。

試圖改變建議的優化設置,但它沒有任何區別。

謝謝大家!

First piece of code

Second piece of code

信用爲演示:@馬克·加西亞

+1

它是編譯器還是智能感知? –

+2

[第一段代碼](http://rextester.com/ORRMS33867),[第二段代碼](http://rextester.com/ESBFG91953)。 –

+0

@LuchianGrigore編譯器也是如此。 VS2012也拒絕第一個片段並接受第二個片段。 – Mysticial

回答

19

按照標準規範:

...名稱聲明在for-init語句中與聲明區域中的聲明區域相同

如果for-init語句是聲明,則聲明的名稱範圍擴展到for語句的結尾。 [§6.5.3]

在for-INIT-聲明中,對於範圍聲明,並且在條件聲明的名稱,如果,而對於,並且switch語句對if,while,for或switch語句(包括受控語句)是本地的,並且不得在該語句的後續條件中或在最外面的塊中重新聲明(或者對於if語句,的最外面的塊)的控制語句[§3.3.3]

MSVC++ 2010的行爲不是標準的,這是一個錯誤

+0

另請參閱[這個答案](http://stackoverflow.com/a/12351531/2513200)到一個有點相關的問題(它與你的解釋一致) – Hulk

0

,當你做這樣的事情:

for (int i = 0; i < 10; i++) 
    { 
    //some code 
    } 

您聲明變量i,並限制它的範圍,對於該代碼塊。所以它只能在for循環中可見。考慮到這一點,你的第一個代碼片段重新定義了變量i;

for (int i = 0; i < 10; i++) 
{ 
     int i; 
} 

編譯器抱怨了重新界定,因爲你現在有相同的名字,相同的數據類型和範圍相同2變量。

至於爲什麼第二段代碼編譯錯誤 - 編譯器。它完全取決於編譯器的實現;如果您更改優化級別,它可能不再顯示。