2010-11-05 28 views
5

¿Por qué la siguiente expresión dada invoca un comportamiento indefinido?¿Por qué es este comportamiento indefinido?

int i = 5; 
i = (i,i++,i) + 1 

Mi pregunta es influenciada por Als' question here

+0

¿esta pregunta agrega algo a la discusión? – KevinDTimm

+0

¿Qué se entiende por comportamiento indefinido? –

+1

Solo por curiosidad: ¿Qué significa '(i, i ++, i)' incluso? ¿Es esta una lista? – sleske

Respuesta

11

No está indefinido.

respondida aquí para C, Sequence points and partial order

creo que lo mismo se aplica en C++ (y aquí está mi respuesta antes de ver ese enlace):

El operador coma introduce un punto de secuencia (y limita hasta cierto punto el orden en que la expresión debe ser evaluada - izquierda antes de la derecha), por lo que:

  • las dos modificaciones de i están separados por un punto de la secuencia (la segunda coma).
  • la modificación de i en i++ está separada de todo lo demás por puntos de secuencia.
  • la modificación de i por = es no separado de la última aparición de i en la expresión, pero eso está bien porque se nos permite acceder a la i y modificarlo sin un punto de secuencia de intervención, siempre que el acceso es " para determinar el valor que se almacenará "(5/4).
  • Como dice Als, en la práctica sería no importa si ese código ha definido el comportamiento o no la condición de que todo el mundo tenía el sentido común de no escribirlo ;-)
+0

Considerando solo el hecho de que ',' es un punto de secuencia, sí. Lamentablemente, el estándar es muy cuidadoso al respecto: 'Tenga en cuenta que algunos aspectos de la secuenciación en la máquina abstracta no están especificados; la restricción anterior sobre los efectos secundarios se aplica a esa secuencia de ejecución particular en la que se genera el código real. –

+0

Quería responder pero no lo hice. [Sin embargo, otra pregunta de comportamiento indefinido] ;-) –

+0

@Let_Me_Be: confieso que no entiendo esa nota al pie. ¿Qué significa que se genere "código real" "en una secuencia de ejecución"? –

0

Debido a que no se define en la norma que de la post-incremento o la asignación se llevará a cabo en primer lugar; queda a la implementación del compilador decidir su orden.

0

no está definido en C++ para asignar un valor incrementado a sí mismo:

i = i++ 

Lo que debería ser i después de esto? ¿Debería ser el valor anterior o uno más el valor anterior? El orden de ejecución se deja al compilador, por lo que diferentes plataformas tendrán diferentes resultados.

+0

Estoy bastante seguro de que 'yo 'debería permanecer sin cambios después de eso. Todavía es un comportamiento técnicamente indefinido debido a lo de la secuencia, pero no hay forma de que haya otro resultado. –

Cuestiones relacionadas