Avatar ·

Was ist der Unterschied zwischen undefined, unspecified und implementation-defined behavior in C++?

Hallo Kollegen! Ich schreibe seit etwa einem halben Jahr in C++ und stoße ständig auf die Begriffe undefined behavior (UB), unspecified behavior und implementation-defined behavior. Ich lese oft in Foren, dass UB eine "schreckliche Sache" ist, bei der das Programm "explodieren" kann, aber ich verstehe den Unterschied zwischen diesen drei Konzepten nicht vollständig.\n\nZum Beispiel weiß ich, dass das Dereferenzieren eines Nullzeigers UB ist. Aber was ist mit der Auswertungsreihenfolge von Funktionsargumenten? Ich habe diesen Code geschrieben:\n\n```cpp\n#include \n\nint foo() { std::cout << "foo "; return 1; }\nint bar() { std::cout << "bar "; return 2; }\n\nint main() {\n int x = foo() + bar(); // Welche Ausgabereihenfolge?\n std::cout << x;\n return 0;\n}\n```\n\nBei verschiedenen Compilern (GCC und Clang) habe ich unterschiedliche Ausgaben erhalten: mal "foo bar 3", mal "bar foo 3".