En lenguaje C++ prefijo operadores de incremento/decremento volver lvalues , mientras que los postfijos vuelven rvalues . Mientras tanto, todos los operadores modificadores requieren argumentos lvalue. Esto significa que el resultado del incremento/decremento del prefijo puede pasarse a cualquier otro operador adicional que requiera un argumento lvalue (incluyendo incrementos/decrementos adicionales).
Por la misma razón en C++ se puede escribir código como este
int i = 0;
int *p = &++i;
que incrementar i
y hacer p
punto de i
. Unary &
requiere lvalue operando, por lo que funcionará con el resultado del prefijo ++
(pero no con postfix one).
Expresiones con múltiples incorporadas en incrementos de prefijo/decrementos aplicadas al mismo objeto producen comportamiento indefinido, pero son sin embargo bien formadas (es decir, "compilable").
Expresiones como ++foo--
no son válidas porque en C++ los operadores de posfijo tienen mayor prioridad que los prefijos. Los frenos pueden cambiar eso. Por ejemplo, (++foo)--
es una expresión bien formada, aunque conduce de nuevo a un comportamiento indefinido.
Relacionados: http://stackoverflow.com/a/3601661/706836 – Pyrodante