¿Es el comportamiento de i = i++ realmente indefinido?

Posible duplicado:
¿Podría alguien explicar estos comportamientos indefinidos (i = i ++ + ++i , i = i ++, etc…).

De acuerdo con el estándar c++,

i = 3;
i = i++;

dará lugar a un comportamiento indefinido.

Usamos el término «comportamiento indefinido» si puede conducir a más de un resultado. Pero aquí, el valor final de será 4 sin importar cuál sea el orden de evaluación, así que ¿no debería llamarse esto realmente «comportamiento no especificado»?i

Respuestas:9 Respuestas 9
Tiempo:hace 11 años, 7 meses
Última modificación:hace 2 años, 8 meses

Solución

La frase, «… el valor final de será 4 sin importar cuál sea el orden de evaluación…» es incorrecto. El compilador podría emitir el equivalente a esto:i

i = 3;
int tmp = i;
++i;
i = tmp;

o esto:

i = 3;
++i;
i = i - 1;

o esto:

i = 3;
i = i;
++i;

En cuanto a las definiciones de términos, si se garantizara que la respuesta fuera 4, eso no sería un comportamiento no especificado o indefinido, sería un comportamiento definido.

Tal como está, es un comportamiento indefinido de acuerdo con el estándar (Wikipedia), por lo que incluso es libre de hacer esto:

i = 3;
system("sudo rm -rf /"); // DO NOT TRY THIS AT HOME … OR AT WORK … OR ANYWHERE.

Otras respuestas

En C y también en C++, el orden de cualquier operación entre dos puntos de secuencia depende completamente del compilador y no puede depender de él. El estándar define una lista de cosas que componen los puntos de secuencia, de memoria esto es

  1. el punto y coma después de una instrucción
  2. el operador de coma
  3. Evaluación de todos los argumentos de función antes de la llamada a la función
  4. el &&&&and || operando

Buscando la página en wikipedia, las listas son más completas y describen más en detalle. Los puntos de secuencia son un concepto extremadamente importante y si aún no sabes lo que significa, te beneficiarás enormemente al aprenderlo de inmediato.

Deja un comentario