2011-01-26 14 views
26

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?

+1

Es una excelente pregunta en mi humilde opinión :-) –

+0

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

+1

@Jason: That la pregunta es específica de C++ –

Respuesta

15

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.

+0

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. –

+1

@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. –

+0

@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? –

2

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?

+2

Esto debería ser un comentario. –

+0

@ Jason..yes. No puedo hacer esto en C - int * ptr = & ++ i –

+1

@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ó. –

2

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í:

Undefined behavior and sequence points reloaded

+0

Si el tipo del objeto no es _un tipo definido por el usuario, entonces el preincremento debe ser un _valor_, de todos modos. –

+0

Pregunto sobre el comportamiento en C porque en C++, tiene sentido devolver lvalue a medida que se va a devolver el objeto incrementado. –

+1

@Charles: jeje ... sí. Como OP no mencionó el tipo de objeto, respondí solo una parte de la pregunta. – Nawaz

Cuestiones relacionadas