¿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
¿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
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:
i
están separados por un punto de la secuencia (la segunda coma).i
en i++
está separada de todo lo demás por puntos de secuencia.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).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. –
Quería responder pero no lo hice. [Sin embargo, otra pregunta de comportamiento indefinido] ;-) –
@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"? –
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.
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.
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. –
¿esta pregunta agrega algo a la discusión? – KevinDTimm
¿Qué se entiende por comportamiento indefinido? –
Solo por curiosidad: ¿Qué significa '(i, i ++, i)' incluso? ¿Es esta una lista? – sleske