2010-03-06 3 views
9

Perché i seguenti non danno un errore?Perché funziona lo stesso nome della variabile count negli anelli FOR annidati?

for (int i=0; i<10; ++i) // outer loop 
{ 
    for (int i=0; i<10;++i) // inner loop 
    { 
    //...do something 
    } 
//...do something else 
} 

Il modo in cui ho capito, variabili tra parentesi graffe ({...}) sono di portata solo all'interno di queste parentesi graffe. Ma il ciclo interno è all'interno delle parentesi del ciclo esterno. Quindi, non appena ho dichiarato int i=0 per il ciclo interno, non dovrei ricevere un errore su più definizioni?

+0

Come probabilmente già ora, mentre funziona, non dovresti farlo. Può risultare in una minore leggibilità e in alcuni bug molto cattivi. – helpermethod

risposta

14

Si sta effettivamente creando una nuova variabile con lo stesso nome di un'altra variabile. Poiché sono in ambiti diversi, questo è permesso e la variabile nello scope interno "possiede" il nome. Non sarà possibile accedere all'ambito esterno i all'interno dell'ambito interno.

La dichiarazione di ciclo for stesso fa parte dell'ambito del ciclo for, quindi conta come parte dell'ambito di visibilità interno nel caso del secondo i.

+0

Handy link con esempi C++ di diversi ambiti: http://h30097.www3.hp.com/docs//base_doc/DOCUMENTATION/V40F_HTML/AQTLTBTE/DOCU_016.HTM –

+0

@Justin non c'è modo di accedere al ciclo esterno di qualunque ? –

+0

No. Basta nominare il ciclo interno 'i' qualcos'altro. È comune vedere le variabili di indice del ciclo annidato come caratteri progressivi dell'alfabeto che iniziano con 'i',' j', 'k', ecc. –

2

Il modo migliore per capire questo è quello di pensare a tutto tra la (e) quando si dichiara un ciclo for come all'interno delle parentesi graffe di quella per ciclo, almeno per quanto si riferisce allo scopo.

Per capire ciò, si consideri una funzione in cui non è stata dichiarata alcuna variabile x, quindi il seguente codice interno fornirà un errore. (Siamo anche assumendo che avete altra variabile x definito globalmente.)

for (int x = 0; x < 10; x++) 
{ 
    something(); 
} 
x++; // error, x is not defined. 
2

Il compilatore C++ accetta questo come valida, poiché la portata del secondo è solo entro il {} parentesi. Se si implementa lo stesso in C, verrà visualizzato un errore simile a questo:

$ gcc test.c 
test.c: In function ‘main’: 
test.c:10: error: ‘for’ loop initial declaration used outside C99 mode 
test.c:12: error: ‘for’ loop initial declaration used outside C99 mode 

Questo è illegale nella maggior parte dei dialetti C; si tratta di una dichiarazione del legale C++, e così può essere accettata se si sta compilando C con un compilatore C++:

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

E 'comune avere un iteratore ciclo solo nel campo di applicazione del ciclo in C++, ma C fa certo (specialmente con C90, non C99), che la dichiarazione è al di fuori dell'ambito del ciclo. Spero che questo aiuti ... :-)

Quindi, quando si dichiara un altro ciclo FOR all'interno di quello precedente, l'ambito inizia fresco e il codice viene compilato senza errori in C++ o C99. Questa è la solita norma accettata per una dichiarazione dell'ambito.

+0

È lo stesso concetto anche quando si utilizza la stessa variabile nello stesso ambito - Ad esempio: 'for (int i = 0; i <10; i ++) {// codice} per (int i = 0; i <10; i ++) {// qualche altro codice} 'È valido in C++ ma non è valido nella maggior parte dei dialetti C. – reubenjohn

0

SEI SICURO DI NON OTTENERE UN ERRORE MENTRE ESEGUITE QUESTO ....?

si sta tentando di definire le due variabili int all'interno dello stesso limite. A causa di ciò questo genererà l'errore.in C# se u provare lo stesso codice si otterrà l'errore

di errore 1 Una variabile locale chiamato 'i' non può essere dichiarato in questo ambito perché darebbe un significato diverso a 'i', che è già usato in ambito "genitore o attuale" per indicare qualcos'altro

+1

SI SONO SICURO ....! No, ho capito meglio il problema, penso che il comportamento in C++ sia corretto. –