No se especifica cuál de los argumentos a +
se evalúa primero, pero eso ni siquiera importa, porque en C y C++, modificar el mismo objeto dos veces sin un punto de secuencia intermedio es un comportamiento completamente indefinido.
Aquí está modificando x
tres veces sin un punto de secuencia intermedia, por lo que está bien fuera de la reserva;)
La parte pertinente de la norma C99 es "6.5" expresiones:
2 Entre el anterior y el siguiente punto secuencia de un objeto tendrá su valor almacenado modificado como máximo una vez por la evaluación de una n expresión. Además, el valor anterior será de solo lectura para determinar el valor que será almacenado.
y
3 La agrupación de operadores y operandos se indica por la sintaxis . Excepto como se especifica más adelante (para la función de llamada(), & &, ||,:?, y comas operadores), el orden de evaluación de subexpresiones y el orden en el que efectos secundarios tienen lugar son tanto no especificado .
Es posible escribir código legal que demuestra el orden no especificado de evaluación - por ejemplo:
#include <stdio.h>
int foo(void)
{
puts("foo");
return 1;
}
int bar(void)
{
puts("bar");
return 2;
}
int main()
{
int x;
x = foo() + bar();
putchar('\n');
return x;
}
(Es sin especificar si se obtiene la salida de foobar
o barfoo
).
Duplicados: http://stackoverflow.com/questions/949433/could-anyone-explain-these-undefined-behaviors-iiiii-etc http://stackoverflow.com/questions/1826414/whats-the-value- of-ii-closed http://stackoverflow.com/questions/1788696/how-the-code-behaves-different-for-java-andc-c-compiler – bk1e
lol. El mod mod-cerró su propia pregunta: D – Earlz
@ bk1e: Gracias por los enlaces. Tenía la sensación de que esto se trataría aquí antes, pero no surgió cuando hice la pregunta. Pensé que la manera más rápida de encontrar el original sería simplemente preguntar. :) –