2012-07-26 11 views

Respuesta

8

Esto se debe a que en C++ (pero no en C), el resultado de ++x es un valor l, lo que significa que es asignable y, por lo tanto, puede encadenarse.

Sin embargo, el resultado de x++ NO es un valor l, sino que es un prValue, lo que significa que no se puede asignar y, por lo tanto, no se puede encadenar.

+1

Relacionados: http://stackoverflow.com/a/3601661/706836 – Pyrodante

6

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.

+0

¿Puede mostrar alguna documentación que indique que el resultado no está definido? Me parece que debería estar completamente bien definido (evaluado de derecha a izquierda). –

+0

@ RichardJ.RossIII UB porque * (C++ 11, 1.9p15) "Si un efecto secundario en un objeto escalar no se está secuenciando en relación con un efecto adicional en el mismo objeto escalar o un cálculo de valor utilizando el valor del mismo objeto escalar , el comportamiento no está definido. "* – ouah

+0

@Richard J. Ross III: el bien conocido párrafo 5/4 en la especificación del lenguaje C++ (C++ 98, C++ 03). Es ilegal (en el sentido UB) modificar el mismo objeto dos veces sin intervenir * punto de secuencia * (SP). C++ no define el orden de evaluación para los operadores integrados sin SP. No existe tal cosa como "evaluado de izquierda a derecha" en C++ sin SP. Cualquier pedido requiere intervención de SP. No hay punto de secuencia en '++ - foo', por lo tanto, el comportamiento no está definido. C++ 11 utiliza un enfoque formal diferente para la secuencia, pero el principio básico sigue siendo el mismo. – AnT

Cuestiones relacionadas