2. Con mi compilador, el siguiente código imprime
Copias 49. ¿Independientemente del orden
de evaluación, esto no debería imprimir 56?
int i = 7;
printf("%d\n", i++ * i++);
Aunque
los operadores de postincremento y postdecremento ++ y --
realicen sus operaciones después de que ceder el valor
anterior, el significado "de después" a meno
es mal entendido.
No
se garantiza que un incremento o decremento se realice inmediatamente
después dejarse el valor anterior y antes de que cualquier
otra parte de la expresión sea evaluada.
Simplemente
se puede garantizar que la actualización será realizada
justo antes de que la expresión sea considerada "terminada".
En
el ejemplo, el compilador decidió multiplicar el valor
anterior por sí mismo y realizar ambos incrementos después.
El comportamiento de código que contiene efectos colaterales
múltiples y ambiguos siempre ha sido indefinido. No intentes
averiguar como va a funcionar tu compilador. Es mejor que cambies
el código para que funcione con cualquier compilador, independientemente
de cómo trate estos casos.