2013-11-25 8 views
31

Ich mache C++ in Visual Studio 2010 und fand etwas seltsames Verhalten. Um eine lange Geschichte kurz zu machen, fand ich, dass dies nicht kompilieren:C++ - Dekodierung der Schleifenzählvariable inkonsistentes Verhalten?

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

Diese richtige scheint, da die Variable i bereits in der for-Schleife Header deklariert wird.

Jetzt aber, wenn ich eine andere for-Schleife vor der Re-Deklaration von i einfügen, dann plötzlich der Compiler, Intellisense usw. Thiks der Code ist richtig - keine echte Warnungen geben (Versuchte Warnungen Ebene 3 und vier (/ W3 und/w4)). Also, dies zu tun tatsächlich kompilieren und ausführen:

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

    int i = 11; 
} 

Persönlich finde ich es seltsam, dass insering andere for-Schleife legitimiert das ansonsten gleiche Code-Szenario. Jeder Art Geist kann mir sagen, was ich hier übersehen habe?

Vielen Dank im Voraus!

EDIT: Wow, danke an alle für alle Antworten und Demos - Du bist super! :) Diese Probe, die einen Fehler enthüllte, kam mir in den Sinn, ich nahm nur an, dass MS so etwas schon bemerkt hätte und es behoben hätte ... zumindest in VS2013.

Es wurde versucht, die Optimierungseinstellungen wie vorgeschlagen zu ändern, aber es machte keinen Unterschied.

Danke allen!

First piece of code

Second piece of code

Kredit für Demos: @ Mark Garcia

+1

Ist es der Compiler oder Intellisense? –

+2

[Erstes Stück Code] (http://rextester.com/ORRMS33867), [zweites Stück Code] (http://rextester.com/ESBFG91953). –

+0

@LuchianGrigore Compiler als auch. VS2012 weist auch das erste Snippet zurück und akzeptiert das zweite. – Mysticial

Antwort

19

Nach der Standardspezifikation:

... Namen erklärt in der for-init-Anweisung befinden sich in derselben deklarativen Region wie in der Bedingung deklariert

Wenn die for-init-Anweisung eine Deklaration ist, erstreckt sich der Geltungsbereich der deklarierten Namen auf die Ende der for-Anweisung. [§6.5.3]

und

Namen in der for-init-Anweisung deklariert, die für Bereichsdeklaration, und in dem Zustand, wenn, während für , und switch-Anweisungen sind lokal für die if-, while-, for- oder switch-Anweisung (einschließlich der kontrollierten Anweisung) und dürfen weder in einer nachfolgenden Bedingung dieser Anweisung noch im äußersten Block (oder für die if-Anweisung) neu deklariert werden der äußersten Blöcke) der kontrollierten Aussage [§3.3.3]

Das Verhalten von MSVC++ 2010 ist nicht Standard und es ist ein Fehler.

+0

Siehe auch [diese Antwort] (http://stackoverflow.com/a/12351531/2513200) zu einer etwas verwandten Frage (die mit Ihrer Interpretation übereinstimmt) – Hulk

0

, wenn Sie so etwas wie:

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

Sie Variable deklarieren i und beschränken es beschränkt sich auf die für die Code-Block. Es wird also nur innerhalb der for-Schleife sichtbar sein. In diesem Sinne definiert Ihr erstes Code-Snippet die Variable i neu;

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

der Compiler beschwert sich über eine Neudefinition, weil Sie jetzt 2 Variable mit dem gleichen Namen, der gleichen Datentyp und denselben Umfang haben.

So, warum das zweite Stück Code kompiliert -Compiler-Bug. Es hängt nur von der Compiler-Implementierung ab; Wenn Sie die Optimierungsstufe ändern, wird sie möglicherweise nicht mehr angezeigt.

Verwandte Themen