En C++, el operador de preincremento proporciona lvalue porque se devuelve el objeto incrementado, no una copia. Pero en C, da rvalue. ¿Por qué?¿Por qué el operador de preincremento da rvalue en C?
Respuesta
C no tiene referencias. En C++ ++i
devuelve una referencia a i
(lvalue) mientras que en C devuelve una copia (incrementada).
C99 6.5.3.1/2
El valor del operando de la pre fi x ++ operador se incrementa. El resultado es el nuevo valor del operando después del incremento. La expresión ++ E es equivalente a (E + = 1).
‘‘value of an expression’’ <=> rvalue
Sin embargo, por razones históricas creo "referencias no ser parte de C" podría ser una posible razón.
Pero todavía no puedo entender por qué devuelve una copia en preincremento. ¿Por qué simplemente no retorno incrementado i como lo hace en decir, i = j. Aquí, el original i, después de ser cambiado, se devuelve. Del mismo modo, en i = i + 1, yo mismo podría ser devuelto después de haber sido cambiado. –
@HappyMittal: las expresiones realmente no devuelven valores, tienen valor (o evalúan a un valor) y otras propiedades como tipo y _valor-ness_, la expresión '++ i' no" devuelve "una copia, allí no es copia '++ i' evalúa el nuevo valor de' i'. No hay copia a menos que la use en una expresión más grande que hace una copia. –
@Charles Bailey: Ok, estoy de acuerdo en que en ++ i se evalúa el nuevo valor de i. Pero mi pregunta es que en i = j, i se cambia y la expresión produce un valor l. Así que ++ i, es decir, i = i + 1 es más o menos lo mismo que i = j, entonces ¿por qué en este caso, la expresión no da un valor l? –
Por fuera de mi cabeza, no puedo imaginar ninguna declaración útil que pueda resultar del uso de una variable preincrementada como valor l. En C++, debido a la existencia de sobrecarga del operador, puedo. ¿Tiene un ejemplo específico de algo que no puede hacer en C debido a esta restricción?
Esto debería ser un comentario. –
@ Jason..yes. No puedo hacer esto en C - int * ptr = & ++ i –
@Filip Es mi respuesta (ciertamente no rigurosa) a la pregunta que se planteó. La incorporación de operadores sobrecargados en C++ hizo que el constructo pre-incremento-como-valor sea más valioso, por lo tanto, se agregó. –
C99 dice en la nota (de la sección 6.3.2.1 $),
El nombre '' lvalue '' proviene originalmente de la expresión de asignación E1 = E2 , en la que el operando de la izquierda E1 es se requiere que sea un valor (modi fi cable). Quizás se considere mejor como que representa un objeto '' localizador value ''. Lo que a veces se llama '' rvalue '' está en este estándar internacional descrito como el '' valor de una expresión ''.
Espero que explique por qué ++i
en C, devuelve rvalue.
En cuanto a C++, yo diría que depende del objeto que se incrementa. Si el tipo del objeto es un tipo definido por el usuario, siempre puede devolver lvalue. Eso significa que, siempre se puede escribir i++++++++
o si ++++++i
tipo de i
es Index
como se define aquí:
Si el tipo del objeto no es _un tipo definido por el usuario, entonces el preincremento debe ser un _valor_, de todos modos. –
Pregunto sobre el comportamiento en C porque en C++, tiene sentido devolver lvalue a medida que se va a devolver el objeto incrementado. –
@Charles: jeje ... sí. Como OP no mencionó el tipo de objeto, respondí solo una parte de la pregunta. – Nawaz
- 1. ¿El operador de preincremento es seguro para subprocesos?
- 2. ¿Por qué esta llamada rvalue es ambigua?
- 3. ¿por qué preferimos? a ?? operador en C#?
- 4. ¿Por qué anular el operador()?
- 5. temporales C++ rvalue en plantilla
- 6. Por qué "delete [] [] ... multiDimensionalArray;" el operador en C++ no existe
- 7. Preincremento más rápido que poscreción en C++ - ¿cierto? Si es así, ¿por qué es?
- 8. ¿Por qué no puedes sobrecargar el '.' operador en C++?
- 9. confusión de enlace de rvalue en C++
- 10. ¿Por qué no hay operador || = en C/C++?
- 11. C# ¿qué hace el operador == en detalle?
- 12. ¿Qué piensas sobre el operador ?? = en C#?
- 13. ¿qué es el operador "??" en C#?
- 14. ¿Qué significa el operador '=>' en C#?
- 15. ¿Qué hace el operador/= en C#?
- 16. ¿Por qué incluso necesitamos el operador "delete []"?
- 17. ¿Por qué el operador% se conoce como el operador "módulo" en lugar del operador "restante"?
- 18. ¿Por qué C++ 0x rvalue reference no es el valor predeterminado?
- 19. ¿Por qué utilizar la identidad en la definición de reenvío para C++ 0x rvalue reference?
- 20. numpy.shape da respuestas inconsistentes - ¿por qué?
- 21. "Leer" un preincremento de POD no produce un comportamiento indefinido. ¿Por qué exactamente?
- 22. ¿Por qué hay un operador sizeof ... en C++ 0x?
- 23. ¿Qué significa en C#: usar - = operador por eventos?
- 24. ¿Qué hace el operador ">>" en C#?
- 25. ¿Qué significa el operador C# =>?
- 26. Por qué el operador = devuelve la referencia no const referencia
- 27. por qué el emulador da el número IMEI 000000000000000
- 28. ¿por qué el Xdocument me da una declaración utf16?
- 29. lValue a RValue conversiones
- 30. ¿Por qué el operador de módulo no funciona para el doble en C#?
Es una excelente pregunta en mi humilde opinión :-) –
http://stackoverflow.com/questions/371503/why-is-i-considered-an-l-value-but-i-is-not –
@Jason: That la pregunta es específica de C++ –