什么是不确定值?

我在c99标准中找到了这个

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

以上陈述对我来说并不清楚。 任何人都可以解释这是什么,它的优点和缺点是什么?

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

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

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

 int a; int b = a; 

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

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

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

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

通常,任何位模式都落在底层存储表示所允许的空间内(在可能是int枚举中),但不被认为是其正式定义的受限域的有效“值”。 关于陷阱表示及其根源的出色描述可以在这个答案中找到。 以上只是一个非常简单的已知无效表示可能出现的代表。 实际上,它在硬件中用于检测触发无效状态的值。 我认为它们是“恐慌”的价值观。 同样,上述代码完全是理想化的,用于certificate“价值”的概念,这不是“有效的”,但实际上是已知的。

除非另行指定,否则静态对象在程序启动时包含零或空指针值。 仅当显式指定初始值时,才会初始化自动和动态分配的对象; 否则它们最初具有不确定的值(通常,存储中恰好存在任何位模式,甚至可能不代表该类型的有效值)。

参考: WikiPedia