2010-10-13 10 views
8

Ist der folgende Code C++ gültig?Ist dieser Code C++ gültig?

const int var = 10; 
{ 
    int var[var]; // why doesn't this give any error ? 
} 

Hinweis: Der Code kompiliert auf meinem g ++ - Compiler.

+0

Warum wäre es * * nicht gültig sein? –

Antwort

5

Ja der Code ist gültig C++. Nicht lokal var ist bis zur Deklaration des lokalen var sichtbar.

Also int var[var] definiert ein lokales Array von 10 ganzen Zahlen.

19

Wie ist es? Nein. Wenn es im Körper einer Funktion wäre? Ja.

Die erste Zeile deklariert eine ganzzahlige Konstante mit dem Namen var mit einem Wert von 10.

Die Klammer beginnt einen neuen Block. Innerhalb dieses Blocks wird eine neue Variable mit dem Namen var deklariert, die ein Array von int mit einer Größe gleich dem Wert der Ganzzahlkonstante ist, die zuvor als var (10) deklariert wurde.

Der Schlüssel ist, dass varbis auf die erste Variable bezieht sich nach die zweite Variable namens var vollständig erklärt wird. Zwischen dem Semikolon nach der zweiten Deklaration und der schließenden Klammer verweist var auf die zweite Variable. (Wenn es einen Initialisierer für die zweite Variable, würde var beginnen auf die zweite Variable zu verweisen unmittelbar vor dem Initialisierer.)

+0

Lol - +1 für das Bit "im Körper einer Funktion": P –

+0

@Billy: Nun, ich denke, das ist etwas wichtig; Wenn dieser Code im Namespace oder Klassenbereich wäre, müßte der Block ein Namespace oder eine Klasse oder Funktion oder etwas sein ... –

+0

@James McNellis: Name, der sich versteckt, oder eines meiner am meisten gehassten Features. Sie können stundenlang versuchen zu verstehen, was los ist ... –

1

Ja der Code gültig ist C++ Es ist ein Konzept von SCOPE: Verstecken Namen

const int var = 10; 
    { 
    int var[var]; // why doesn't this give any error ? 
    } 

ich denke, das den Link an deine Zweifel

IN C++ löscht:

http://msdn.microsoft.com/en-US/library/9a9h7328%28v=VS.80%29.aspx

In C:

http://publib.boulder.ibm.com/infocenter/comphelp/v8v101/index.jsp?topic=%2Fcom.ibm.xlcpp8a.doc%2Flanguage%2Fref%2Fzexscope_c.htm

Wenn u Auf diesem tiefe Wissen wollen: für diesen Link gehen, hier die Informationen über lexikalische und dynamischen Scoping

http://en.wikipedia.org/wiki/Scope_%28programming%29

aber im Code: "Scope ::" der Sichtbarkeit von var .Hier unterscheidet es sich wie lokale und nicht-lokale Variable. Innenklammern {x = 1; } lokale Variable. wo wie hier {y = 1; {x = 1;}}, hier ist es anders.

hilfreiche Links

http://msdn.microsoft.com/en-us/library/b7kfh662%28VS.80%29.aspx

http://www.awitness.org/delphi_pascal_tutorial/c++_delphi/c++_scope_variables.html

+0

@BE: Ich denke, die ersten 3 Links, die gab, ist klar. Über dieses Beispiel> Die Ramining keine Notwendigkeit –