2014-09-25 15 views
14

Non ero molto chiaro con l'operatore di incremento post che ho sempre utilizzato con i cicli for. Il mio ultimo e recente acquisizione comprensione operatore di post incremento è la seguente:È necessario comprendere meglio il ciclo - operatore post incremento

int a = 5 
int b = a++ //a will increment and return back its old value 5 
so b = 5 

Armati di questa nuova conoscenza ho deciso di capire/applicarlo ai luoghi in cui i comunemente usato l'operatore di post incremento come in un ciclo for . Ora sembra che io sono perso dal momento che sto finendo con l'uscita sbagliata teoricamente

Si consideri il seguente codice di

for(int i=0 ; i< 3 ; i++) 
{ 
    std::cout << i; 
} 

primo ciclo

i starts with 0 which is less than 3 so (increment by 1 however since its i++ it returns old value 0) 
so cout should display 1 // But it displays 0 

secondo ciclo

i is now 1 which is less than 3 so i++ is applied - Now i is 2 and returns back 1 
so cout should display 2 //But it display 1 

Third Loop

i is now 2 which is less than 3 so i++ is applied - Now i is 3 and returns back 2 
so cout should display 3 //But it display 2 

Quarto Loop

i is now 3 which is not less than 3 so loop exits 

Qualcuno potrebbe chiarire la mia comprensione e mi punto nella giusta direzione. L'output dovrebbe essere 0,1,2 dove sto andando male?

+0

Il terzo ciclo può essere ottimizzato via poiché nulla utilizza il valore restituito, quindi diventa 3 in ogni caso – EdChum

+3

Questa domanda non riguarda l'operatore post incremento, ma la comprensione del ciclo for (la prima elaborazione dell'espressione del ciclo avviene solo dopo prima elaborazione del corpo del loop). Puoi leggere a questo proposito qui: http://www.cplusplus.com/doc/tutorial/control/ – Ilya

+0

Apprezzerei se qualcuno potesse chiarire che su – Rajeshwar

risposta

34

Quello che stai manca è quando ciascuna di queste sezioni del prospetto for accada:

for (int i = 0 ; i < 3 ; i++) 
// 111111111 22222 333 
  • Il primo bit accade volta prima sono fatto alcun iterazioni.
  • La seconda espressione viene valutata prima di ogni potenziale di iterazione e, se false, non vengono eseguite ulteriori iterazioni.
  • Il terzo bit viene eseguito allo fine di ogni iterazione, prima di tornare a valutare il secondo bit.

Ora rileggere attentamente l'ultimo punto. Lo i++ viene eseguito allo fine di di una iterazione, dopo lo dello cout << i. E subito dopo viene verificata la condizione di continuazione (la seconda parte).

Così il ciclo è effettivamente la stessa:

{ // Outer braces just to limit scope of i, same as for loop. 
    int i = 0; 
    while (i < 3) { 
     cout << i; 
     i++; 
    } 
} 

Ecco perché si ottiene 0 1 2.

+0

potresti spiegare il motivo per cui il terzo bit viene eseguito alla fine dell'iterazione? –

+8

@ Co.Aden Perché le specifiche della lingua lo dicono. 'for' è' while' con lo zucchero sintattico, perché è un costrutto talmente comune da fare cose come l'incremento. Vedi pagina 60 (capitolo 3.5) di "The C Programming Language 2nd edition". (o il posto corrispondente nel libro di Bjarne Stroustrup su C++). – MattBianco

+0

Solo una breve nota: l'operatore pre-incremento è sempre più veloce dell'operatore post-incremento; quindi usalo per i loop – esskar

3

Devi solo sapere che la dichiarazione int i = 0 viene eseguita per prima, vale a dire, i prende prima il valore 0, verifica se la condizione è vera e quindi cosa viene eseguito il corpo del ciclo.

Quindi, i viene incrementato.

6

Il punto e virgola in un ciclo for delimita tre diverse espressioni. Il valore della terza espressione è irrilevante per il comportamento del ciclo. È possibile sostituire i++ con ++i e il proprio ciclo si comporterebbe allo stesso modo; in entrambi i casi, i viene incrementato di 1.

Per osservare il comportamento degli operatori di incremento, considerare i seguenti cicli:

for(int i = 0 ; i++ < 3 ;) cout << i; 
/*      ^^^ Nothing here!      */ 

nota che la terza espressione è vuota. L'uscita è 123 -0 viene saltata perché il test, incluso l'incremento, si verifica prima di ogni iterazione del ciclo.

Come si comporta il ciclo postincrementato rispetto a un analogo con l'operatore di preincremento?

for(int i = 0 ; ++i < 3 ;) cout << i; 

Ora la produzione è 12 -3 non viene stampato perché il test condizionale vede il valore 3 appena viene incrementato di che, si esce dal ciclo.

+0

Mi sento come se la spiegazione sopra mancasse di "roba". Dalla mia comprensione, in un tradizionale 'for' loop' i <3; i ++ ', il' i' viene valutato, quindi incrementato (output 0, 1, 2); nel secondo test tradizionale, pre-incremento 'i <3; ++ i', 'i' viene incrementato, quindi valutato (quindi la differenza nell'output):" [quest'ultimo] incrementa il valore di una variabile e restituisce il valore risultante, il [precedente] incrementa il valore della variabile e restituisce il valore prima dell'incremento. " Questa differenza di comportamento è significativa e non irrilevante (ci sono tomi di lavoro dedicati a ... – Thomas

+0

... il significato della sua importanza e il modo in cui i due influenzano il comportamento del ciclo, ad esempio se il ciclo viene eseguito.Il modo in cui lo penso (il modo in cui l'ho scritto) è un po 'diverso dal modo in cui l'articolo che ho citato lo capisce (l'articolo presenta una spiegazione "più vera"). – Thomas

Problemi correlati