En una pregunta del examen de programación C, encontré esto:
int a, b=0, x=4, y=5; a=((a=x%y?b+1:y--)&&(x-=y))||(y-=6);¿Es esta expresión UB?
Diría que no, debido al punto de secuencia (SP) entre operadores lógicos y entre expresiones de ?: . Entonces, según tengo entendido, el horrible truco se evaluaría correctamente como:
x%y this gives 4 (exp is true) a= b+1 this assigns 1 to a and we have a SP (exp is true) y-- this is not evaluated x-=y this assigns -1 to x and we have a SP (exp is true) y-=6 this is not evaluated a= this assigns the result of the || operator to a (1) Finalmente a=1 , x=-1 , nada más cambia. ¿Cualquier error?
¿Esta declaración de expresión en una pregunta de examen de programación C tiene un comportamiento indefinido?
¿Es esta expresión UB?
No.
¿Cualquier error?
No.
Quería escribir un texto aquí, pero ya escribiste la explicación... No tengo nada que hacer. Notas: También hay un punto de secuencia después de ? . Incluso si se evaluara y-- , porque && es un punto de secuencia, estaría bien.
#include <stdio.h> int main() { int a, b=0, x=4, y=5; a=((a=x%y?b+1:y--)&&(x-=y))||(y-=6); printf("a=%i\nb=%i\nx=%i\ny=%i\n", a,b,x,y); return 0; }PRODUCCIÓN:
a=1 b=0 x=-1 y=5Entonces, creo que tiene razón en todo, pero no creo que cuente como un comportamiento indefinido.