2010-10-13 13 views
8

Il seguente codice è valido in C++?Questo codice è valido in C++?

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

Nota: il codice viene compilato sul mio compilatore g ++.

+0

Perché dovrebbe * non * è valida? –

risposta

5

Sì, il codice è valido C++. var non locale è visibile fino al punto di dichiarazione di var locale.

Quindi, int var[var] definisce un array locale di 10 numeri interi.

19

As-is? No. Se fosse nel corpo di una funzione? Sì.

La prima riga dichiara una costante intera denominata var con un valore di 10.

Le parentesi inizia un nuovo blocco. All'interno di quel blocco, viene dichiarata una nuova variabile, denominata var, che è una matrice di int con una dimensione uguale al valore della costante intera dichiarata in precedenza come var (10).

La chiave è che var riferisce alla prima variabile fino dopo la seconda variabile denominata var è completamente dichiarato. Tra il punto e virgola che segue la seconda dichiarazione e la parentesi di chiusura, var fa riferimento alla seconda variabile. (Se ci fosse un inizializzatore per la seconda variabile, var avrebbe cominciato a fare riferimento alla seconda variabile immediatamente prima della inizializzazione.)

+0

Lol - +1 per il bit "nel corpo di una funzione": P –

+0

@Billy: Beh, penso che sia un po 'importante; se questo codice fosse nello spazio dei nomi o nell'ambito della classe, dovresti rendere il blocco uno spazio dei nomi o una classe o una funzione o qualcosa ... –

+0

@James McNellis: nascondere il nome, o una delle mie funzioni più odiate. Puoi passare ore a cercare di capire cosa c'è che non va ... –

1

Sì, il codice è valido C++ Si tratta di un concetto di scopo: nascondere i nomi

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

Penso che questo link cancella il tuo dubbio

in C++:

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

Se u vuole profonda conoscenza su questo: Andare per questo link, ecco le informazioni è di circa lessicale rispetto scoping dinamico

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

ma nel codice: "Scope ::" di visibilità di var .Qui differisce da variabile locale e non locale. Controventi interni {x = 1; } Variabile locale. dove come qui {y = 1; {x = 1;}}, qui è diverso.

link utili

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: Penso che i primi 3 link che hanno dato siano chiari. A proposito di questo esempio> La ramining non è necessaria –