¿Por qué el operador pre-incremento da rvalue en C?


En C++, el operador pre-incremento da lvalue porque se devuelve el objeto incrementado en sí, no una copia. Pero en C, da rvalue. ¿Por qué?

Author: Benoît, 2011-01-26

3 answers

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 del operador prefix ++ se incrementa. El resultado es el nuevo valor del operando después del incremento. La expresión ++Eis equivalente a (E+ = 1).

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

Sin embargo, por razones históricas creo que "las referencias que no son parte de C" podría ser un posible motivo.

 16
Author: Prasoon Saurav,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-01-26 08:14:11

C99 dice en la nota al pie (de la sección 6 6.3.2.1),

El nombre "lvalue" viene originalmente de la expresión de asignación E1 = E2, en el que el operando izquierdo E1 es debe ser un lvalue (modificable). Es quizás mejor considerado como representación de un objeto " localizador valor’’. Lo que a veces se llama "rvalue" está en esta Internacional Estándar descrito como el " valor de una expresión".

Espero que eso explique por qué ++i en C, devuelve rvalue.


En cuanto a C++, diría que depende del objeto que se incremente. Si el tipo del objeto es un tipo definido por el usuario, entonces siempre puede devolver lvalue. Eso significa que siempre puede escribir i++++++++ o ++++++i si el tipo de i es Index como se define aquí:

Comportamiento indefinido y puntos de secuencia recargados

 3
Author: Nawaz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 10:32:32

En la parte superior de mi cabeza, no puedo imaginar ninguna declaración útil que podría resultar del uso de una variable pre-incrementada como un lvalue. En C++, debido a la existencia de sobrecarga de operadores, puedo. ¿Tiene un ejemplo específico de algo que se le impide hacer en C, debido a esta restricción?

 2
Author: Jason LeBrun,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-01-26 07:58:59