2015-02-08 24 views
6

Quando compilo ed eseguo il codice seguente con counter++ o ++counter sostituito per x, l'output è identico; in entrambi i casi, i numeri 1 - 10:In un ciclo for, c'è una differenza tra pre/post-incremento di una variabile di controllo del ciclo in termini di quantità totale di iterazioni?

for (int counter = 1; counter < 11; x) 
{ 
    std::cout << counter << endl; 
} 

Inizialmente ho pensato che sarebbe ++counter incrementerà di 1 e quindi restituire il nuovo valore prima per l'espressione booleana nell'intestazione ciclo è stata valutata. Ad esempio, quando si inizia con counter = 1 e si utilizza ++counter, counter avrà un valore 2 nell'espressione booleana. Questo sembra non essere il caso, in quanto entrambe le uscite sono identiche piuttosto che la versione ++counter con una iterazione in meno, come mi aspettavo.

Lettura in giro, appare ++counter e counter++ incremento counter di 1 all'inizio o alla fine del corpo del ciclo rispettivamente. In tal caso non si tratta, almeno concettualmente, di un'azione identica? Perché la fine e l'inizio del ciclo sono la stessa cosa una volta che il ciclo ha superato la prima iterazione.

L'unica volta posso vedere questo fare la differenza è nella prima iterazione, dove dovrebbe uscita 1 per la console se viene utilizzato std::cout << counter << endl;counter++ (perché 1 viene aggiunto al contatore alla fine del ciclo). Mentre std::cout << counter << endl; deve inviare 2 alla console se viene utilizzato ++counter (perché 1 viene aggiunto al contatore all'inizio del ciclo).

Oltre alla domanda di cui sopra, la prego di spiegare con precisione l'ordine in cui i tre azioni vengono valutate nell'intestazione ciclo for, e spiegare esattamente dove si verificano le iterazioni quando si utilizza i++ e ++i.

Grazie mille!

+0

In breve: No, non c'è alcuna differenza per il numero di iterazioni. –

+0

Vedere [** for loop **] (http://en.cppreference.com/w/cpp/language/for). – juanchopanza

+0

In quel punto del loop, sono equivalenti. Si noti inoltre che i compilatori scambieranno quasi certamente il post-incremento con un pre-incremento in quel luogo, almeno quando le ottimizzazioni sono attivate. – stj

risposta

15

Non c'è differenza. Nei compilatori precedenti, ++counter era più veloce perché non creava una variabile temporanea, ma tutti i moderni compilatori possono ottimizzarlo. Per gli oggetti pesanti con operatori di incremento personalizzati (non in linea), ++counter può essere ancora più efficiente.

quanto riguarda quando valutazione avviene:

for (initialization; condition; increment/decrement) 
    code; 

è valutato come

{ 
    initialization; 
    while (condition) 
    { 
     code; 
     increment/decrement; 
    } 
} 
+0

Puoi guardare qui per altri esempi: http://en.cppreference.com/w/cpp/language/for – MAC

+0

@StenSoft Cheers per l'aiuto! –

+0

Un accenno al fatto che nei build di devug, '++' pre sarà molto più veloce: e deboli deboli buikds possono essere noiosi con cui lavorare. – Yakk

5

Il C++ for-loop possono essere approssimativamente considerarsi zucchero sintattico consultato (utilizzando l'esempio) :

int counter = 1; 
while (counter < 11) 
{ 
    std::cout << counter << endl; 
    x; 
} 

Così, l'inizializzazione s la correzione viene eseguita per prima, l'espressione di condizione viene eseguita prima di ogni iterazione e l'istruzione di incremento viene eseguita alla fine di ogni iterazione.

Possiamo vedere qui che l'utilizzo di operatori post-incremento o pre-incremento non fa alcuna differenza per la logica del ciclo, sebbene possano esserci altre differenze (il post-incremento richiede effettivamente di mantenere una copia del vecchio valore della variabile come è il valore dell'espressione, che ha alcuni costi associati, vedere Preincrement faster than postincrement in C++ - true? If yes, why is it?).

+0

Mi sembra un ciclo infinito. – juanchopanza

+1

x qui sarà sostituito da ++ contatore o contatore ++. Sto seguendo la convenzione suggerita dal poster. –

1

contatore ++ rende un contatore aumento copia e restituisce il valore

++ contatore aumenta contatore e restituisce contatore.

Nel ciclo

for(initialization;condition;increment/decrement) 

{body;} 

incremento/decremento è l'ultima linea del loop. Quindi riavvierà il ciclo quando incremento/decremento restituisce un valore. Quindi post-incremento o pre-incremento non influenzerà qui. Vedere questo

What is the difference between pre-increment and post-increment in the cycle (for/while)?