Nachdem ich mich an Perl und ein bisschen C versucht habe, versuche ich C ++ zu lernen und schon bin ich festgefahren von den Details und Fallstricken. Bedenken Sie Folgendes: -
%Vor%Huh, warum der Unterschied?
Zur Klärung : Die Verwendung desselben Namens ist in einem Fall gültig und in einem anderen ungültig.
Willkommen im Universum von C ++! Für Ihre Frage liegt die Antwort in einem Konzept namens "Point-of-Declaration".
%Vor%Aus Abschnitt: -3.3.1.1 (C ++ Standardentwurf) Der Deklarationspunkt für einen Namen ist unmittelbar nach seinem vollständigen Deklarator und vor seinem Initialisierer (falls vorhanden), außer wie unten angegeben.
%Vor%Hier; der 'operator =' ist der Initialisierer. Sie können sagen, dass der Punkt der Deklaration für 'x' noch nicht erreicht ist, also ist der Wert von 'x' unbestimmt.
%Vor%Warum? Aus Abschnitt: -3.3.1.4 (C ++ Standardentwurf) Ein nichtlokaler Name bleibt bis zur Deklaration des lokalen Namens, der ihn versteckt, sichtbar. Hier ist der Punkt der Deklaration bei ';' Charakter. Daher wird der früher sichtbare Wert von 'arr' verwendet, d. H. = 3.
Vielleicht möchten Sie auch wissen, dass Folgendes gilt: -
%Vor%Aus Abschnitt: -Kapitel-3.3.1.4 (C ++ Standardentwurf): - Der Deklarationspunkt für einen Enumerator befindet sich unmittelbar nach seiner Enumeratordefinition.
Aber tu das nicht
%Vor%Warum? Weil Enumeratoren in den umschließenden Bereich der Enumeration exportiert werden. Im obigen Beispiel sind die Enumeratoren Spades, Clubs, Hearts und Diamonds deklariert. Da die Enumeratoren in den umschließenden Bereich exportiert werden, gelten sie als globaler Bereich. Die Bezeichner im Beispiel sind bereits im globalen Gültigkeitsbereich definiert. Es ist also ein Fehler.
Weitere Details und Fallstricke (:-)) finden Sie in Abschnitt 3.3 "Deklarative Regionen und Bereiche" des Entwurfs C ++ - Standard. Wenn Sie interessiert sind, können Sie die PDF-Datei von hier ( Ссылка ).
Tags und Links c++ declaration semantics