PDA

View Full Version : [C++] Dichiarazione variabili in cicli


wingman87
29-07-2007, 00:03
Ho un dubbio, ho scritto un programmino e in un punto di esso ho scritto questo:
while(!fin->eof()){
int i;
if(nf==-1){
while(CONDIZIONE){
FAI QUALCOSA (cambia il valore di nf)
}
i=1;
}else{
cout<<i<<"\n";
for(;i<nf+1;i++)
FAI QUALCOS'ALTRO
i=0;
}
}
Ora, tralasciando a cosa serve, quello che mi interesserebbe sapere è se è normale che funzioni bene, cioè, mi crea un po' di confusione quella dichiarazione "int i;", praticamente questa variabile viene dichiarata una sola volta al primo ciclo o ogni volta viene ridichiarata? Nel secondo caso si vede che occupa sempre la stessa area di memoria perchè il cout mi da una cosa tipo 1000000000 e quindi è corretto, nel primo caso invece allora perchè se invece dichiaro i in questo modo: "int i=1" l'output è 1111111111?
Grazie mille, spero non sia una domanda troppo stupida...

vizzz
29-07-2007, 00:47
la variabile i (che tra l'altro non inizializzi) viene diciamo "ricreata" ad ogni ciclo.
forse vorresti dichiararla come static int i = qualcosa;
in questo modo viene definita e inizializzata una sola volta e la variabile rimane anche all'uscita dallo scope.
come l'hai scritto ora il funzionamento è indefinito, visto che i non essendo inizializzato ha valore indefinito!

wingman87
29-07-2007, 18:34
Il funzionamento è indefinito, quindi il fatto che ogni volta che viene dichiarata questa venga allocata nella stessa area di memoria è anch'esso un caso? In tal caso dovrei modificare il codice, non è un problema, volevo solo capire come funzionano le cose, grazie.

sottovento
30-07-2007, 06:48
Beh, non proprio.
La dichiarazione, messa li', e' corretta. La variabile viene creata ad ogni ciclo e viene poi distrutta al completamento dello stesso.

Quello che ti diceva vizzz e' corretto: quando hai creato la variabile non l'hai inizializzata. Comunque non e' una peculiarita' del fatto che la variabile l'hai dichiarata li', vale per tutte le variabili.
Caso mai dovrai stare attento a non utilizzarla prima di avergli assegnato un valore, ma questo immagino che lo saprai proprio bene, e saprai che vale per qualsiasi variabile.

A proposito del fatto che la variabile e' creata sempre allo stesso indirizzo (immagino intendevi questo, giusto?) e' (quasi) un caso: c'e' un motivo ben preciso, dovuto al funzionamento del compilatore, ma non dovrebbe interessarti se non per cultura personale.
(se ti interessa per un motivo pratico, allora c'e' qualcosa da rivedere: probabilmente, come suggerito da vizzz, occorre cambiare la classe di memorizzazione - la durata della vita - di questa variabile)