PDA

Visualizza la versione completa : [C++] Incremento nel ciclo for()


Gianni91
13-09-2011, 15:23
Scusate non riesco a capire cosa cambia in questo esempio..


int n=5;
for(int i=0;i<n;++i)cout<<i<<endl;
cout<<"Esercizio"<<endl;
for(int i=0;i<n;i++)cout<<i<<endl;

La stampa viene allo stesso modo sia che metto i++,che ++i,io credevo si avere un risultato diverso..


0
1
2
3
4
Esercizio
0
1
2
3
4

Potreste spiegarmi il motivo?? :ciauz:

ESSE-EFFE
13-09-2011, 15:58
In entrambi i casi la variabile i viene incrementata prima della verifica i<n. Quindi s, direi che giusto ottenere lo stesso risultato. Pre-incremento e post-incremento si riferiscono all'istruzione dove sono contenuti, non alle successive. In questo caso pensa semplicemente che i venga incrementata alla fine di ogni ciclo.

Un po' come se fosse:



while (i < n)
{
//....
i++; // (++i lo stesso, solo un minimo pi veloce mi pare)
}

Gianni91
13-09-2011, 16:12
Hai ragione ma questa domanda mi ha fatto pensare ad un'altra cosa..
Nella stampa con ++i,
non vado a stampare con il valore gia incrementato??
es:


int i=5;
for(int i=0;i<n;++i){cout<<i<<endl;}
in questo modo??


1
2
3
4

ESSE-EFFE
13-09-2011, 16:23
No perch, come ti ho gi detto, i viene incrementata alla fine del ciclo, quindi la prima volta vale 0 (il valore a cui l'hai inizializzata).



int i = 0;
while (i < n)
{
cout << i << endl;
++i; // l'incremento come se avvenisse alla fine del ciclo while corrispondente
}

Gianni91
13-09-2011, 16:36
Originariamente inviato da ESSE-EFFE
No perch, come ti ho gi detto, i viene incrementata alla fine del ciclo, quindi la prima volta vale 0 (il valore a cui l'hai inizializzata).



int i = 0;
while (i < n)
{
cout << i << endl;
++i; // l'incremento come se avvenisse alla fine del ciclo while corrispondente
}


Capito ma a questo punto,con i++,che prima di incrementare i,restiruisce lo stesso i non incrementato,dovrebbe stamapare due volte zero?? :confused:


0
0
1
2
3
4

ESSE-EFFE
13-09-2011, 16:46
Originariamente inviato da Gianni91
Capito ma a questo punto,con i++,che prima di incrementare i,restiruisce lo stesso i non incrementato,dovrebbe stamapare due volte zero?? :confused:
No, l'incremento viene eseguito comunque alla fine (lascia perdere cosa restituisce, i viene incrementato in ogni caso), guarda tu stesso:



int i = 0;
while (i < n)
{
cout << i << endl;
i++; // cosa cambia rispetto a prima?
}

sebaldar
13-09-2011, 16:58
[QUOTE]Originariamente inviato da Gianni91
Scusate non riesco a capire cosa cambia in questo esempio..


int n=5;
for(int i=0;i<n;++i)cout<<i<<endl;
cout<<"Esercizio"<<endl;
for(int i=0;i<n;i++)cout<<i<<endl;

[QUOTE]

ai fini della stampa il risultato lo stesso.

Nelle prestazioni il ciclo che usa l'operatore di incremento postfisso leggermente pi lento in quanto il compilatore deve prima memorizzare la variabile (per renderla eventualmente disponibile) e poi incrementa. Nel caso dell'operatore prefisso il compilatore deve solo incrementare la variabile, e fa quindi una operazione in meno.

In realt un moderno compilatore probabilmente ottimizza il codice e genera lo stesso codice macchina in entrambi i casi.

Gianni91
13-09-2011, 17:01
int i = 0;
while (i < n)
{
cout << i << endl;
i++; // cosa cambia rispetto a prima?
}

In effetti compilandolo, ho lo stesso risultato.. :(

Facciamo cosi vediamo la diffrenza tra i++ e ++i,in una assegnazione ad un'altra variabile..


int a = 5;
int b;
b = ++a; // adesso 'b' vale 6e 'a' vale 6
questo perch icrementa subito la a..


int a = 5;
int b;
b = a++; // adesso 'b' vale 5 e 'a' vale 6
questo perch la variabile viene prima utilizzata e poi incrementata..
Questo quello che ho capito io della differenza tra le due..

Ora nel tuo codice


int i = 0;
while (i < n)
{
cout << i << endl;
i++;
}

Perch non viene utilizzata un'altra volta come i non incrementata??? .Intendo reutilizzata xh ho prima il cout... :bh:
Cio non funziona la regola di prima..

ESSE-EFFE
13-09-2011, 17:47
Originariamente inviato da Gianni91
Perch non viene utilizzata un'altra volta come i non incrementata??? .Intendo reutilizzata xh ho prima il cout... :bh:
Ma perch dovrebbe, il cout non la stessa istruzione. Supponi di avere altre istruzioni tra la cout e l'incremento, perch dovrebbero essere legate le due cose?

Come giustamente hai visto, pre-incremento e post-incremento sono significativi in casi come "a = ++b", ma se devi solo incrementare una variabile, sia i++ che ++i equivalgono (salvo le differenze di cui si parlava) a: i = i + 1.

prova invece qualcosa come

cout << i++ << endl;

o

cout << ++i << endl;

per capire la differenza!

Gianni91
13-09-2011, 18:20
Originariamente inviato da ESSE-EFFE
Ma perch dovrebbe, il cout non la stessa istruzione. Supponi di avere altre istruzioni tra la cout e l'incremento, perch dovrebbero essere legate le due cose?

scusami intendevo dire,che contralla se i<n ,stampa i(mettiamo valga 2) ,non la incrementa perch,c' i++ e ricicla,di conseguenza alla successiva stampa essendo non incrementato stampa di nuovo 2..



Come giustamente hai visto, pre-incremento e post-incremento sono significativi in casi come "a = ++b", ma se devi solo incrementare una variabile, sia i++ che ++i equivalgono (salvo le differenze di cui si parlava) a: i = i + 1.

prova invece qualcosa come

cout << i++ << endl;

o

cout << ++i << endl;

per capire la differenza!
Questo codice conferma purtroppo la mia ipotesi sbagliata ,infatti con ++i stampa da 1 a 5 ..
Ma non c' una relazione la la i che stampo e quella del while,io credevo di si..
Possibile ch cosi complicato?!?! ... :cry:

Loading