Avatar ·

¿Cuál es la diferencia entre undefined, unspecified e implementation-defined behavior en C++?

¡Hola, colegas! Llevo unos seis meses escribiendo en C++ y constantemente me encuentro con los términos undefined behavior (UB), unspecified behavior e implementation-defined behavior. A menudo leo en foros que UB es algo "terrible" que puede hacer que un programa "explote", pero no termino de entender la diferencia entre estos tres conceptos. Por ejemplo, sé que desreferenciar un puntero nulo es UB. Pero, ¿qué hay del orden de evaluación de los argumentos de una función? Escribí este código: ```cpp #include int foo() { std::cout << "foo "; return 1; } int bar() { std::cout << "bar "; return 2; } int main() { int x = foo() + bar(); // ¿Cuál es el orden de salida? std::cout << x; return 0; } ``` Con diferentes compiladores (GCC y Clang) obtuve salidas distintas: a veces "foo bar 3", a veces "bar foo 3". El compilador no se quejó, el código funcionó, pero el resultado fue diferente. ¿Esto es UB? ¿O es otra cosa? Otro ejemplo: el tamaño del tipo `int`. Sé que `sizeof(int)` puede ser 4 bytes en una plataforma y 2 u 8 en otra.