Avatar ·

Qual é a diferença entre undefined, unspecified e implementation-defined behavior em C++?

Olá, colegas! Escrevo em C++ há cerca de seis meses e constantemente encontro os termos undefined behavior (UB), unspecified behavior e implementation-defined behavior. Frequentemente leio em fóruns que UB é uma "coisa assustadora" que pode fazer o programa "explodir", mas não entendo completamente a diferença entre esses três conceitos. Por exemplo, sei que desreferenciar um ponteiro nulo é UB. Mas e quanto à ordem de avaliação dos argumentos de uma função? Escrevi 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(); // Qual é a ordem de saída? std::cout << x; return 0; } ``` Em diferentes compiladores (GCC e Clang), obtive saídas diferentes: ora "foo bar 3", ora "bar foo 3". O compilador não reclamou, o código funcionou, mas o resultado foi diferente. Isso é UB? Ou algo diferente? Outro exemplo: o tamanho do tipo `int`. Sei que `sizeof(int)` pode ser 4 bytes em uma plataforma e 2 ou 8 em outra.