Condición para lvalues ​​y rvalues ​​en C

Aquí están las pocas definiciones que leí sobre valores.

  1. Expresiones que pueden ser usadas con & operator. es decir, si & (expresión) no es un error, entonces la expresión es un lvalue

  2. Expresión que da como resultado objetos que no son temporales.

  3. Las expresiones de valores pueden usarse tanto en RHS como en LHS de = operator

  4. Las expresiones de valor pueden usarse solo en RHS

Por favor corrija si está equivocado

Aquí está la pregunta

Leo ++ x es un lvalue y x ++ es un rvalue

int i = 0; printf("%p",(void*)&++i); 

Si es así, ¿por qué es esto un error?

Si lvalue expresiones pueden usarse en lhs

 int i = 0; ++i = 10; 

¿Por qué no puedo usar la statement anterior? Ambas cosas anteriores generan errores

Actualización: Ambas declaraciones anteriores están bien en C ++

++i es un lvalue solo en C ++ , en C es un rvalue (llamado valor de una expresión en el estándar de C) que no se puede asignar.

Ni ++i ni i++ son valores l.

Podría estar pensando en *x++ y *++x que son ambos valores l (si x tiene un tipo de puntero).

Pensé que esta pregunta sería cerrada, y solo dejé un comentario. Qué gran error;)

En C (la etiqueta de la pregunta es C ) ++ el operador i “devuelve” un valor, pero no la variable en sí. Por lo tanto su dirección no se puede recuperar. En otras palabras, ++i no es un lvalue. Tampoco es i++ .

C ++ puede ser diferente de C en relación con ciertas construcciones que son valores de I y R.

http://eli.thegreenplace.net/2011/12/15/understanding-lvalues-and-rvalues-in-c-and-c/

Para C ++ estos dos son valores l.

Este código simple:

 #include  int main() { int i=0; ++i = 10; printf("\n%d\n", i); ++i = ++i; printf("%d\n", i); } 

Comstackdo con gcc dará:

 lvalue.c:3: error: invalid lvalue in assignment lvalue.c:4: warning: incompatible implicit declaration of built-in function 'printf' lvalue.c:5: error: invalid lvalue in assignment 

y para g ++ comstack correctamente y yelds:

 10 12 

La definición formal (bastante vaga) de C11:

(El énfasis en letra negrita fue agregado por mí)

6.3.2.1 Valores, matrices y designadores de funciones

Un lvalue es una expresión (con un tipo de objeto distinto de vacío) que potencialmente designa un objeto (64); Si un valor de l no designa un objeto cuando se evalúa, el comportamiento no está definido. Cuando se dice que un objeto tiene un tipo particular, el tipo se especifica mediante el valor l utilizado para designar el objeto. Un lvalue modificable es un lvalue que no tiene tipo de matriz, no tiene un tipo incompleto, no tiene un tipo cualificado por const, y si es una estructura o unión, no tiene ningún miembro (incluido, recursivamente, cualquier miembro o elemento de todos los agregados contenidos o uniones) con un tipo const-calificado.

Nota al pie (no normativa) con más explicación:

64) El nombre “lvalue” proviene originalmente de la expresión de asignación E1 = E2, en la que se requiere que el operando izquierdo E1 sea un valor (modificable). Quizás se considere mejor que representa un objeto “valor de ubicación”. Lo que a veces se llama “rvalue” se describe en esta Norma Internacional como el “valor de una expresión”.

Por lo tanto, un valor lícito debe ser algo que “potencialmente” designa un objeto. Cualquier “potencial” medio está abierto para interpretación personal …

A pesar de la nota de pie de página anterior, el estándar C carece de una definición formal de un valor de r. Irónicamente, el único lugar en todo el estándar que menciona el valor es esa nota de un pie de página.

En su caso, ni ++ i ni i ++ designan un objeto real, por lo que ninguno de ellos es lvalues. Son más bien valores.

Al hacer ++i un valor, imagina que ahora puedes hacer:

 int i=2; ++i = ++i; 

Aparte de los demonios nasales, ¿cómo te gustaría que i viera después? 4? 3?