C 由实现定义的行为、未定义的行为与未明确的行为

Implementation-defined behavior

由实现定义的行为。例如,int 数据类型的内存空间大小为一般为 4 bytes。

Undefined behavior

未定义的行为。如果程序违反(或者超出) C 标准的规则定义,其执行的结果是无法预料的,换言之,对于这段语句,编译器不用理解(编译器可以不管它,也可以做任何事,包括让你女盆友怀孕 —— bumfod)可以做任何方式的理解,因此得到任何结果都是有可能的。例如,整数溢出就是一个 undefined behavior。

例如,对于如下代码

#include 
using 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。因此我们要注意,在实际情况中不要使用依赖编译器具体实现的代码!

CC BY-SA 4.0 C 由实现定义的行为、未定义的行为与未明确的行为 by 小小泥娃 is licensed under a Creative Commons Attribution-ShareAlike 4.0 International License.

C 由实现定义的行为、未定义的行为与未明确的行为》上有1条评论

发表评论

This site uses Akismet to reduce spam. Learn how your comment data is processed.