2013-11-25 16 views
31

Sto facendo C++ in Visual Studio 2010 e ho riscontrato un comportamento strano. Per fare una lunga storia breve, ho scoperto che questo non compilerà:C++ redeclaration del comportamento inconsistente variabile del conteggio dei cicli?

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

Questo sembra corretto, dal momento che la variabile i è già dichiarato nel ciclo per l'intestazione.

Ora, tuttavia, se inserisco un altro ciclo prima della re-dichiarazione di i, quindi all'improvviso il compilatore, intellisense ecc. Il codice è corretto, non fornisce avvisi reali (tentativi di livello 3 e 4 (/ W3 e/w4)). Quindi, facendo questo sarà effettivamente compilare ed eseguire:

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

    int i = 11; 
} 

Personalmente, trovo strano che insering un altro per-loop legittima l'altrimenti stesso scenario codice. Qualsiasi spirito gentile in grado di dirmi cosa sto trascurando qui?

Grazie in anticipo!

MODIFICA: Wow, grazie a tutti per tutte le risposte e le dimostrazioni - Sei fantastico! :) Questo esempio che ha esposto un bug mi è passato per la testa, ho appena pensato che MS avrebbe notato una cosa del genere e l'ha risolto ... almeno in VS2013.

Provato a modificare le impostazioni di ottimizzazione come suggerito, ma non ha fatto alcuna differenza.

Grazie a tutti!

First piece of code

Second piece of code

credito per le demo: @ Marco Garcia

+1

È il compilatore o l'intellisense? –

+2

[Prima parte di codice] (http://rextester.com/ORRMS33867), [seconda parte di codice] (http://rextester.com/ESBFG91953). –

+0

@LuchianGrigore Compiler pure. VS2012 rifiuta anche il primo snippet e accetta il secondo. – Mysticial

risposta

19

Secondo la specifica standard:

... nomi dichiarato nella for-init-statement sono nella stessa dichiarativa regione come quelle dichiarate nella condizione

Se la for-init-affermazione è una dichiarazione, la portata del nome (s) dichiarata estende al fine della dichiarazione for. [§6.5.3]

e

nomi dichiarati nel for-init-statement, il per-gamma-dichiarazione, e nella condizione di se, mentre, per e le istruzioni switch sono locali rispetto all'istruzione if, while, for o switch (inclusa l'istruzione controllata) e non devono essere dichiarate nuovamente in una condizione successiva di tale istruzione né nel blocco più esterno (o, per la dichiarazione if, qualsiasi dei blocchi più esterni) della dichiarazione controllata [§3.3.3]

Il comportamento di MSVC++ 2010 non è standard e è un errore.

+0

Vedi anche [questa risposta] (http://stackoverflow.com/a/12351531/2513200) a una domanda in qualche modo correlata (che è d'accordo con la tua interpretazione) – Hulk

0

quando si fa qualcosa di simile:

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

si dichiara variabile i e stanno limitando è portata al codice di blocco. Quindi sarà visibile solo all'interno del ciclo for. Con questo in mente, il tuo primo snippet di codice ridefinisce la variabile i;

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

il compilatore si lamenta una ridefinizione perché ora avete 2 variabile con lo stesso nome, stesso tipo di dati e la stessa portata.

Per quanto riguarda il motivo per cui il secondo pezzo di codice compila il bug del compilatore. Dipende esclusivamente dall'implementazione del compilatore; se cambi il livello di ottimizzazione potrebbe non essere più visualizzato.

Problemi correlati