16

我在 c99 标准中找到了这个

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

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

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

4

2 回答 2

15

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

我可以收集的不确定值的最简单示例:

int a;
int b = a;

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

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

关于陷阱表示,它本质上是在与基础正式定义有关的允许值的限制域之外的任何值。下面是一个希望不会混淆的示例。:

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

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

于 2012-11-16T20:11:16.013 回答
5

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

参考:维基百科

于 2012-11-16T20:09:05.910 回答