2010-05-06 12 views
6

Come sono i seguenti validi e non validi come mostrato e cosa significano. Quando si presenterebbe una situazione del genere per scrivere questo pezzo di codice.Operatori di incremento e decremento

++x = 5;  // legal 
--x = 5;  // legal 
x++ = 5;  // illegal 
x-- = 5;  // illegal 
+0

possibile duplicato di http://stackoverflow.com/questions/1860461/why-is-i-i-1-unspecified-behavior –

+1

compiti? Domanda d'esame? –

+0

Non proprio entrambi. Sono solo curioso di sapere. – ckv

risposta

13

Il suffisso (x ++/x--) gli operatori non restituiscono un lvalue (un valore è possibile assegnare in).

restituiscono un valore temporaneo, che è una copia del valore della variabile prima del cambio

Il valore è un rvalue, così si potrebbe scrivere:

y = x++ e ottenere il vecchio valore di x

+0

Dovresti aggiungere quel codice come quello che non dovrebbe mai essere usato. –

+2

@Bruno: perché no? Questo è l'intero punto per l'operatore post-incremento. –

7

Tutti modificano il valore di x più di una volta tra i punti di sequenza e pertanto sono comportamenti non definiti, che è necessario evitare con attenzione. Non vedo dove entri la distinzione tra "legale" e "illegale" - dal momento che il comportamento è legale, qualsiasi comportamento (incluso l'invio di e-mail assortite al Segretario di Stato) è perfettamente in linea con lo Standard.

5

Supponendo che la domanda riguardi gli operatori integrati ++ e --, nessuna di queste dichiarazioni è strettamente legale.

I primi due sono ben formato, cioè esse semplicemente compilabile perché il risultato di incremento prefisso è Ivalue. Gli ultimi due sono non formattati, poiché il risultato dell'incremento postfisso non è un valore rvalore, motivo per cui non è possibile assegnarlo.

Tuttavia, anche i primi due non sono legali in un senso che producono un comportamento non definito. È illegale modificare lo stesso oggetto più volte senza un punto di sequenza intermedio. (Si noti inoltre che i compilatori possono rifiutarsi di compilare un codice ben formato che produce un comportamento indefinito, il che significa che anche la prima coppia potrebbe rivelarsi non compilabile).

9

Dato che sia l'operatore =() che l'operatore ++() possono essere sovraccaricati, è impossibile dire cosa fa il codice senza sapere di più sul tipo di cosa a cui gli operatori vengono applicati.

+1

Curioso perché questo è stato downvoted - l'uomo ha un punto valido. Mi aspetto che l'OP abbia a che fare con ints, ma non c'è nessun tipo menzionato. – Puppy

+0

Credo che sia anche possibile che ciò non comporti un comportamento indefinito se x è un tipo non scalare. –

+0

@DeadMG: le persone minimizzano le cose quando non pensano a loro o pensano di essere troppo "fantasiosi" o "pedanti". –

1

Francamente, non dovresti mai scriverlo. Postincremento e pre-incremento (e decrementi) dovrebbero sempre essere usati da soli. Sono solo ricette per la confusione.

+2

Se li usi solo per conto proprio, quindi post incremento è un operatore senza valore. –

+0

Penso che quando DeadMG ha detto "da soli" intendeva non fare un doppio incarico. Non intendeva escludere cose come 'if (x ++) {/*...*/}' ecc. Giusto, DeadMG? –

+0

Intendevo assolutamente escluderli. Postincremento e pre-incremento sono zucchero sintattico, non buono quando effettivamente usato in un'espressione. Se hai un disperato bisogno di questo, fallo manualmente, lascia che il compilatore lo trasformi nell'altro modulo. Ma non vedo in quali condizioni possibili potresti averne bisogno comunque. – Puppy

1

L'unico posto in cui posso pensare dove si verifica una situazione del genere è con un sovraccarico dell'operatore di operatore ++ e operatore =. Anche allora, la definizione non è chiara. Quello che dici è fondamentalmente è aggiungere uno a x, quindi assegnargli 5. Sorge una domanda come perché dovresti incrementare x prima di assegnargli 5? L'unica spiegazione possibile è se si dispone di una sorta di classe in cui l'operatore ++ in qualche modo incrementa un contatore interno, quindi l'assegnazione. Non ho idea del perché sia ​​necessaria una cosa del genere.

2

++x e --x sia restituirti x (dopo che è stato incrementato/decrementato). A quel punto puoi fare quello che vuoi, incluso assegnargli un nuovo valore.

x++ e x-- sia vi offrono ciò x era (poco prima di è stato incrementato/decrementato).Alterare questo valore non ha più senso che cambiare il valore di ritorno di qualsiasi funzione ordinaria:

obj->getValue() += 3; // pointless 
Problemi correlati