2010-10-18 26 views
23

Recientemente me enteré del operador , y el hecho de que introduce un punto de secuencia.¿i = 0, ++ i definido?

También aprendí que el siguiente código condujo a un comportamiento indefinido:

i = ++i; 

Debido i se modificó dos veces entre dos puntos de secuencia.

¿Pero qué pasa con los siguientes códigos?

i = 0, ++i; 
i = (0, ++i); 

Si bien conozco las reglas, no puedo llegar a una conclusión. Entonces, ¿es un comportamiento definido o no?

edición: Así como @paxdiablo menciones, definido o no, esto es realmente una mala práctica que debe ser evitado. Esta pregunta se realiza únicamente con fines educativos y una mejor comprensión de las "reglas".

+21

No sé por qué la gente sigue haciendo preguntas como esta. No importa si es indefinido, es un código malo. Deberías _no_ usarlo, definido o de otra manera. – paxdiablo

+10

@paxdiablo: ¿De verdad crees que utilizaría una declaración tan inútil en el código real? Solo se trata de entender las reglas mejor. Nada mas. – ereOn

+0

@ereOn es bueno aprender las reglas, eso es cierto. Pero después de un tiempo, la experiencia generalmente lleva a los codificadores a evitar construcciones que no están bien definidas y que son de uso común en todas las plataformas. –

Respuesta

27

Sí. = tiene una precedencia mayor que ,, por lo que esta expresión es equivalente a (i = 0), ++i. , es un punto de secuencia, por lo que se garantiza que el ++i se produce después de la asignación.

No estoy seguro si se define i = (0, ++i). Mi conjetura sería no; no hay punto de secuencia entre el incremento y la asignación.

+0

Llegué a la misma intuición, pero el hecho de que no puedo estar seguro me molesta mucho. Gracias. – ereOn

+0

@ereOn: Mi intuición es que, debido a que el estándar no lo garantiza, no está definido. –

+0

Debido a los paréntesis, el incremento se evaluará antes de la asignación, por lo que también creo que será indefinido. – codymanix

7
i = 0, ++i; 

Como la otra respuesta señaló, no es Undefined Behavior.

i = (0, ++i); 

el comportamiento es indefinido en este caso porque no hay ningún punto de secuencia entre ++i y la asignación a i.

i = (0, ++i, 0) 

El comportamiento está bien definida en C++ 03, en mi humilde opinión.

Ver extended discussion para una expresión similar.

+1

+1. Simple y correcto. – Nawaz

Cuestiones relacionadas