Considere el siguiente código C:
#include <stdio.h> int main(void) { int a = 0; printf("%d\n", ++a += 1); } ++ tiene prioridad sobre += , por lo que debe evaluarse primero. Entonces tenemos a a la izquierda y 1 a la derecha. Ahora, según tengo entendido ++a debería dar como resultado a (solo cambia su valor) que es lvalue, entonces, ¿por qué esta declaración da el siguiente error?
lvalue required as left operand of assignmentEl operador de incremento de prefijo ++ da como resultado el valor incrementado de su operando, sin embargo, no es un valor l. Sección 6.5.3.1p2 del estándar C : describe la semántica de la siguiente manera:
El valor del operando del operador prefijo
++se incrementa. El resultado es el nuevo valor del operando después del incremento. La expresión++Ees equivalente a(E+=1). Consulte las discusiones sobre operadores aditivos y asignación compuesta para obtener información sobre restricciones, tipos, efectos secundarios y conversiones y los efectos de las operaciones en los punteros.
Luego, la sección 6.5.16.2p3 con respecto a los operadores de asignación compuesta establece:
Una asignación compuesta de la forma
E1 op = E2es equivalente a la expresión de asignación simpleE1 = E1 op (E2), excepto que el lvalueE1se evalúa solo una vez, y con respecto a una llamada de función de secuencia indeterminada, la operación de un la asignación compuesta es una evaluación única.
Y 6.5.16p3 con respecto al operador de asignación establece además:
Un operador de asignación almacena un valor en el objeto designado por el operando izquierdo. Una expresión de asignación tiene el valor del operando izquierdo después de la asignación, pero no es un valor l.
Por lo tanto, explícitamente no está permitido. Incluso si lo fuera, una expresión como ++a += 1 haría que a se modificara más de una vez sin un punto de secuencia intermedio que desencadenaría un comportamiento indefinido.
Este es uno de esos lugares donde C y C++ difieren. De hecho, C++ permite que el resultado del operador = y, por extensión, la asignación compuesta y el prefijo ++ / -- , sea un valor l.