Consideremos el siguiente código:
int main() {
int i = 2;
int b = ++i++;
return 3;
}
Se compila con lo siguiente con un error:
<source>: In function 'int main()':
<source>:3:16: error: lvalue required as increment operand
3 | int b = ++i++;
| ^~
Esto me parece justo. El incremento de postfix tiene mayor prioridad que el incremento de prefijo, por lo que el código se analiza int b = ++(i++);
y i
es un valor r. De ahí el error.
Consideremos ahora esta variante con paréntesis para anular las prioridades predeterminadas:
int main() {
int i = 2;
int b = (++i)++;
return 3;
}
Este código compila y devuelve 3. Por sí solo, esto me parece justo, pero parece estar en contradicción con el primer código.
La pregunta: ¿por qué (++i)
es un lvalue
cuándo i
no?
¡Gracias!
ACTUALIZACIÓN: el mensaje de error que se muestra arriba era de gcc (x86-64 9.2). Aquí está la representación exacta: error con gcc
Clang x86-64 9.0.0 tiene un mensaje bastante diferente: error con clang
<source>:3:13: error: expression is not assignable
int b = ++i++;
^ ~~~
Con GCC, tiene la impresión de que el problema está en el operador de postfix y luego puede deambular por qué ++i
está bien y i
no, de ahí mi pregunta. Con Clang es más claro que el problema está en el operador de prefijo.