2011-01-26 8 views
26

In C++, l'operatore di pre-incremento fornisce lvalue perché viene restituito l'oggetto incrementato stesso, non una copia. Ma in C, dà valore. Perché?Perché l'operatore di pre-incremento fornisce il valore in C?

+1

La sua un'ottima domanda IMHO :-) –

+0

http://stackoverflow.com/questions/371503/why-is-i-considered-an-l-value-but-i-is-not –

+1

@ Jason: Che la domanda è specifica per C++ –

risposta

15

C non ha riferimenti. In C++ ++i restituisce un riferimento a i (lvalue) mentre in C restituisce una copia (incrementata).

C99 6.5.3.1/2

Il valore dell'operando della pre fi x ++ operatore viene incrementato. Il risultato è il nuovo valore dell'operando dopo l'incremento. L'espressione ++ Eis equivalente a (E + = 1).

‘‘value of an expression’’ <=> rvalue

Tuttavia, per ragioni storiche penso "riferimenti non essendo parte di C" potrebbe essere un possibile motivo.

+0

Ma ancora non riesco a capire perché restituisca una copia in pre-incremento. Perché non restituire l'I incrementato come fa, ad esempio, i = j. Qui, l'originale i, dopo essere stato modificato, viene restituito. Allo stesso modo, in i = i + 1, i, potrebbe essere restituito da solo dopo essere stato modificato. –

+1

@HappyMittal: le espressioni non restituiscono realmente i valori, hanno valore (o valgono un valore) e altre proprietà come type e _lvalue-ness_, l'espressione '++ i' non" restituisce "una copia, lì non è una copia. '++ i' valuta il nuovo valore di' i'. Non c'è copia a meno che non lo usi in un'espressione più grande che ne fa una copia. –

+0

@Charles Bailey: Ok, sono d'accordo che in ++ valuto il nuovo valore di i. Ma la mia domanda è che in i = j, i è cambiato e l'espressione produce un valore. Quindi ++ i cioè I = i + 1 è praticamente uguale a i = j, allora perché in questo caso l'espressione non produce un lvalue? –

2

In cima alla mia testa, non riesco a immaginare nessuna utile dichiarazione che potrebbe derivare dall'uso di una variabile pre-incrementata come valore di l. In C++, a causa dell'esistenza dell'overloading dell'operatore, posso. Hai un esempio specifico di qualcosa che non puoi fare in C, a causa di questa restrizione?

+2

Questo dovrebbe essere un commento. –

+0

@ Jason..yes. Non riesco a farlo in C - int * ptr = & ++ i –

+1

@Filip È la mia (dichiaratamente non rigorosa) risposta alla domanda che è stata posta. L'aggiunta di operatori sovraccaricati in C++ ha reso il valore pre-incremento-come-l-valore più prezioso, quindi è stato aggiunto. –

2

C99 dice nella nota (sezione $ 6.3.2.1),

Il nome '' lvalue '' è originaria dall'espressione assegnazione E1 = E2 , in cui l'operando sinistro E1 è richiesto di essere un valore (modificabile). È forse meglio considerato come che rappresenta un oggetto '' localizzatore valore ''. Ciò che viene talvolta chiamato "rvalue" è in questo standard internazionale descritto come il valore "" di un'espressione ".

La speranza che spiega perché ++i in C restituisce valore.


Per quanto riguarda il C++, direi che dipende dall'oggetto da incrementare. Se il tipo dell'oggetto è un tipo definito dall'utente, può sempre restituire lvalue. Ciò significa, si può sempre scrivere i++++++++ o ++++++i se il tipo di i è Index come definito qui:

Undefined behavior and sequence points reloaded

+0

Se il tipo dell'oggetto è _non_ un tipo definito dall'utente, il pre-incremento deve essere un _valore_, comunque. –

+0

Mi sto chiedendo del comportamento in C perché in C++, ha senso restituire lvalue come oggetto da restituire. –

+1

@Charles: hehe .. sì. Dato che l'OP non ha menzionato il tipo dell'oggetto, ho risposto solo a un lato della domanda. – Nawaz

Problemi correlati