Implementation-defined behavior
由实现定义的行为。例如,int 数据类型的内存空间大小为一般为 4 bytes。
Undefined behavior
未定义的行为。如果程序违反(或者超出) C 标准的规则定义,其执行的结果是无法预料的,换言之,对于这段语句,编译器不用理解(编译器可以不管它,也可以做任何事,包括让你女盆友怀孕 —— bumfod)可以做任何方式的理解,因此得到任何结果都是有可能的。例如,整数溢出就是一个 undefined behavior。
例如,对于如下代码
#includeusing namespace std; int main() { int n=1; cout<< n << " " << (n = n - 3) << " " << (n = n + 2); return 0; }
g++ (i686-posix-dwarf-rev2, Built by MinGW-W64 project) 7.1.0
的编译运行结果为 1 -2 0
,而g++ (GCC-6.3.0-1) 6.3.0
的结果为 0 0 0
“modify 和 read 之间没有 sequential point 就是 undefined behavior” —— bumfod.
Unspecified behavior
未明确的行为。对于有歧义的语句,可以按照任何可行的方式来解释。例如,函数在计算其参数时的顺序(求值顺序)就是一个 unspecified behavior,程序以任何顺序计算都可以。除此之外,形如 i = i+++i++;
的值也算是 unspecified behavior。因此我们要注意,在实际情况中不要使用依赖编译器具体实现的代码!
沙发