2015-05-10 12 views
5
for(int i = 0; i < 3; i++) 
{ 
    for(int j = 0; j < 3; j++) 
    { 
     int n; 
     n++; 
     printf("n : %d\n", n)' 
    } 
} 

L'output del codice è 1 2 3 4 5 6 7 8 9. Mi chiedo perché la variabile n nel ciclo for non sia inizializzata quando la variabile è dichiarata eseguito.C++ per ciclo variabile lifetime è strano

+0

Non so come funziona esattamente C++, ma, con l'esperienza che ho avuto con C, forse si sta allocando nello stesso blocco di memoria? prova int n = 0. –

risposta

12

Non stai inizializzando mai n su un valore specifico. Il C++ non lo farà di default quando chiami int n. Invece, si riserva solo un blocco di memoria di dimensioni intere. Quindi quando chiami n++, il programma sta semplicemente afferrando qualunque valore si trovi in ​​quella memoria e incrementandolo. Dato che lo stai facendo in rapida successione e non crei nuove variabili intermedie, capita di afferrare sempre la stessa memoria. Come sottolinea @NicolasBuquet, l'ottimizzazione del compilatore può anche essere responsabile della coerenza con la quale viene raccolto lo stesso blocco di memoria.

Se si dovesse assegnare un valore a n, (ad esempio int n = 1;) questo comportamento andrebbe via perché un valore specifico verrà scritto nel blocco di memoria assegnato a n.

+2

E penso che sia dovuto anche all'ottimizzatore: dato che dichiari la stessa variabile int ad ogni iterazione del tuo loop, ho capito che il compilatore lo ottimizzava e metteva la variabile fuori dal ciclo piuttosto che crearla a ogni passo. –

+0

Ottimo punto, @NicolasBuquet. Sembra molto probabile. – seaotternerd

+0

Ha molto senso senza quell'ottimizzazione, perché nient'altro viene dichiarato nello stack durante ogni iterazione, quindi la variabile ottiene sempre la stessa posizione nello stack. – Henrik

1

In C++, nessuna variabile è inizializzata con un valore predefinito; è necessario specificarne uno esplicitamente nel caso si dovesse riscontrare la necessità di farlo.

Il risultato del codice è davvero indefinito; è solo pura fortuna che stai ricevendo i numeri da 1 a 9 in sequenza. Su qualche altra macchina o implementazione di C++, potresti ottenere risultati diversi.

+2

Molte variabili sono inizializzate con valori predefiniti. Le variabili automatiche che sono tipi built-in non vengono inizializzate automaticamente. I membri delle classi che sono scritti male potrebbero non essere inizializzati automaticamente. Tuttavia, sei corretto che 'n' nel codice di esempio non è inizializzato. Le variabili –

+1

con durata di memorizzazione statica sono inizializzate in base al valore (cioè inizializzate a zero per i tipi fondamentali) – vsoftco

+0

lol, ok gente, mi avete portato lì. Sono corretto su entrambi i punti. – thesentiment