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?
risposta
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.
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. –
@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. –
@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? –
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?
Questo dovrebbe essere un commento. –
@ Jason..yes. Non riesco a farlo in C - int * ptr = & ++ i –
@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. –
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:
Se il tipo dell'oggetto è _non_ un tipo definito dall'utente, il pre-incremento deve essere un _valore_, comunque. –
Mi sto chiedendo del comportamento in C perché in C++, ha senso restituire lvalue come oggetto da restituire. –
@Charles: hehe .. sì. Dato che l'OP non ha menzionato il tipo dell'oggetto, ho risposto solo a un lato della domanda. – Nawaz
- 1. Ruby 'Range.last' non fornisce l'ultimo valore. Perché?
- 2. Comportamento di preincremento e il post-operatore in C e Java
- 3. Perché il valore di i == 0 in questo codice C++?
- 4. Perché l'operatore di assegnazione restituisce il valore assegnato in C#?
- 5. Perché connect() fornisce EADDRNOTAVAIL?
- 6. numpy.shape fornisce risposte incoerenti - perché?
- 7. Perché il compilatore fornisce il costruttore di copie predefinito
- 8. Perché PyMongo 3 fornisce ServerSelectionTimeoutError?
- 9. fornisce una dimensione extra di una struttura in C#
- 10. System.Environment.Version che fornisce un valore non accurato
- 11. Perché l'allocatore in C++ fornisce la specializzazione per il tipo void
- 12. Perché System.Web.HttpUtility.UrlEncode che fornisce il nome dello spazio dei nomi non esiste in Visual C# 2008?
- 13. il valore minimo di float in java è positivo perché?
- 14. Perché C# non consente il blocco di un valore nullo?
- 15. perché Xdocument mi fornisce una dichiarazione utf16?
- 16. perché questo codice fornisce EXC_BAD_ACCESS (usando IMP)
- 17. Il C++ 11 fornisce funzioni di hashing per std :: type_info?
- 18. In C#, perché il dizionario [0] ++ funziona?
- 19. Perché jQuery non fornisce un metodo .firstChild?
- 20. C++ cout fornisce l'identificatore non dichiarato
- 21. Perché la funzione ngrams() fornisce distinti bigram?
- 22. Perché Data.Time.Clock fornisce DiffTime e NominalDiffTime?
- 23. Perché il valore di "questo" cambia?
- 24. Perché Data.Set fornisce elem e lista?
- 25. Perché il valore negativo di Integer.MIN_VALUE ha lo stesso valore?
- 26. Perché il parassita 'volatile' è in C++?
- 27. Perché JUnit non fornisce i metodi assertNotEquals?
- 28. Perché il download dell'immagine con l'LWP di Perl mi fornisce il file di dimensioni errate?
- 29. cambiando il valore const in C
- 30. L'indirizzo IP della macchina in PHP fornisce: 1 ma perché?
La sua un'ottima domanda IMHO :-) –
http://stackoverflow.com/questions/371503/why-is-i-considered-an-l-value-but-i-is-not –
@ Jason: Che la domanda è specifica per C++ –