什么是不确定的价值?

Omk*_*ant 13 c

我在c99标准中找到了这个

3.17.2
1 indeterminate value
either an unspecified value or a trap representation
Run Code Online (Sandbox Code Playgroud)

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

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

Who*_*aig 13

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

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

int a;
int b = a;
Run Code Online (Sandbox Code Playgroud)

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

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

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

enum FooBar { foo=0, bar=1 };
enum FooBar fb = (enum FooBar)2;
Run Code Online (Sandbox Code Playgroud)

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

  • 它的实现定义了`int`*是否有*任何陷阱表示.如果它没有(并且我从未真正使用过具有"int"陷阱值的实现),那么读取不确定值并不是未定义的行为:你知道它不是陷阱值,所以它是一个`int`类型的有效值,它只是未指定哪一个.相比之下,在C++中,显式UB可以读取任何未初始化的值.在C和C++中,读取陷阱表示是UB. (3认同)

ale*_*oot 5

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

参考:WikiPedia