什么是不确定的价值?

时间:2012-11-16 20:06:59

标签: c

我在c99标准中找到了这个

3.17.2
1 indeterminate value
either an unspecified value or a trap representation

以上陈述对我来说并不清楚。 谁能解释这是什么以及它的优点和缺点是什么?

一些例子将受到高度赞赏。

2 个答案:

答案 0 :(得分:13)

两者的区别(不确定值和陷阱表示)是基本的。在一种情况下,您没有已知的价值。在另一个中,您有一个已知无效的值。

我可以集合的不确定价值的最简单的例子:

int a;
int b = a;

没有与a相关的确定'价值'的概念。它有某种东西(因为它占用了内存),但它没有定义“什么”,因此是不确定的。总的来说,这个概念就像它听起来一样简单:除非已经决定什么是什么,否则它不能用于任何评估(如果它有帮助,可以考虑r值)和确定性结果。

实际值取决于语言,编译器和内存管理策略。例如,在C的大多数实现中,未初始化的范围变量或由对malloc的调用返回的指针所指向的内存将包含之前存储在该地址的任何值。另一方面,大多数脚本语言会将变量初始化为某个默认值(0,“”等)。

关于陷阱表示,它基本上是在与基础形式定义有关的允许值的受限域之外的任何值。接下来是一个有希望的非混淆的例子。 :

enum FooBar { foo=0, bar=1 };
enum FooBar fb = (enum FooBar)2;

一般情况下,任何位模式都属于底层存储表示所允许的空间(在枚举中可能是int)但不被视为其正式受限域的有效“值”定义。有关陷阱表示及其根的杰出描述可在this answer找到。以上只是 very 简单已知无效表示可能出现的代表。实际上,它在硬件中用于检测触发无效状态的值。我认为它们是“恐慌”的价值观。同样,上面的代码在演示“价值”的概念时完全是理想主义,这不是“有效”,但实际上是已知的。

答案 1 :(得分:5)

  

除非另有说明,否则静态对象包含零或null   程序启动时的指针值。自动和动态   只有初始值为,才会初始化已分配的对象   明确指定;否则他们最初有不确定性   值(通常,无论位模式恰好出现在   存储,甚至可能不代表该类型的有效值。)

参考:WikiPedia