C++中undefined、unspecified和implementation-defined behavior之间有什么区别?
大家好!我写C++大约半年了,经常遇到术语undefined behavior (UB)、unspecified behavior和implementation-defined behavior。我经常在论坛上看到说UB是“可怕的东西”,会导致程序“爆炸”,但我并不完全理解这三个概念之间的区别。
例如,我知道解引用空指针是UB。但函数参数的求值顺序呢?我写了这样的代码:
```cpp
#include
int foo() { std::cout << "foo "; return 1; }
int bar() { std::cout << "bar "; return 2; }
int main() {
int x = foo() + bar(); // 输出顺序是什么?
std::cout << x;
return 0;
}
```
在不同的编译器(GCC和Clang)中,我得到了不同的输出:有时是"foo bar 3",有时是"bar foo 3"。编译器没有报错,代码能运行,但结果不同。这是UB吗?还是别的什么?
另一个例子:`int`类型的大小。我知道`sizeof(int)`在一个平台上可能是4字节,在另一个平台上可能是2或8字节。