2015-11-14 80 views

回答

3

这是控制和数据之间的区别。

未定值可能导致意想不到的结果值(函数返回后,分配到全局变量等)。但是你的程序的正常控制流程仍将被遵循。

陷阱表示,在另一方面,可能会导致不被你的使用分支语句描述控制流(函数调用,条件,循环,goto方法,退货)。

一个典型的例子是信令的NaN在IEEE 754根据FPU控制字,遇到的信令的NaN可引起立即转移到异常处理程序(也称为软件中断又名信号)。行为,正确的程序结构和正确的数据,为此,标准并没有规定要求 -

+0

因此,如果自动变量的值不是陷阱表示,我吨被称为未经确认的价值。是对的吗? –

0

条款

不确定的行为的定义。

未定义行为 - 行为,在使用非便携式的或错误的程序构建体,错误的数据,或不定值对象的,为此,标准并没有规定要求。

在一个const对象的构造,如果对象 或任何其子对象的的值被经由未 获得,直接或间接glvalue访问,从构造的这个指针, 值未指定如此获得的对象或子对象的位置。

struct C; 
void no_opt(C*); 

struct C { 
    int c; 
    C() : c(0) { no_opt(this); } 
}; 

const C cobj; 

void no_opt(C* cptr) { 
    int i = cobj.c * 100; // value of cobj.c is unspecified 
    cptr->c = 1; 
    cout << cobj.c * 100 // value of cobj.c is unspecified 
     << ’\n’; 
} 

在上述例子中不存在未初始化值,因此没有陷阱表示但标准不被授权者(指定)其行为。上例中的编译器可以做任何事情,即不同的编译器会给出不同的结果。

英语术语使用更多或更少逐字:“未指定”意味着 的是,精确的语义不被给定标准,但 程序不会变得未定义或非法的构造。

陷阱表示是一组比特,当解释为特定类型的 值,导致未定义的行为的。陷阱 表示是最常见的浮点和指针 值,但在理论上,几乎任何类型的可能有陷阱 表示。未初始化的对象可能会持有陷阱 表示形式。这给出了与旧规则相同的行为:访问 未初始化的对象会产生未定义的行为。

看看下面的例子:

unsigned char a, b; 
memcpy(&a, &b, 1); 
a -= a; 
  • 这里的ab地址被采取,因此他们的价值仅仅是不确定的。
  • 由于unsigned char从来没有陷阱的表示,不确定的价值只是没有指定,任何值unsigned char可能发生。
  • 最后a必须保持值0

ab具有未指定的值:

3.19.3未指定的值

相关类型,其中该国际标准并没有规定在其上选择任何值要求有效值实例

+1

实际上,我认为委员会在缺陷审查期间决定,上述代码的语义不清楚,并决定明确表示观察持有不确定值的无符号字符值会使其保持不确定值,而不是将其转换为未指定的值。因此,如果'unsigned char'是8位,则a-a的值可以是-255到+255之间的任何值,并且在上面的'a'之后可以保存任何值。我认为表达的结果将是未指定的,而不是不确定的,但我不确定这一点。 – supercat

相关问题