gpt4 book ai didi

C - 不确定值是不确定的吗?

转载 作者:太空狗 更新时间:2023-10-29 16:42:21 27 4
gpt4 key购买 nike

根据这个post一个不确定的值是:

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

根据谷歌,不确定的定义是:

  • 不确定、已知或确定
  • 存疑;含糊不清。

根据自由词典,可确定的是:

  • 能够确定

根据 merriam-webster,确定(在特定上下文中)是:

  • 通过调查、推理或计算找出或做出决定

因此,常识表明,即使不确定值在编译时是未知的,它在运行时也是完全可确定的,例如您始终可以读取占用该内存位置的任何内容。

还是我错了?如果是,为什么?

编辑:为了澄清,我发布这篇文章是为了与一位用户激烈争论,他试图说服我不确定的值是不确定的,我对此深表怀疑。

编辑 2:澄清一下,我所说的“可确定”并不是指稳定或可用的值,即使它是未初始化内存的垃圾值,该垃圾的值仍然可以确定。我的意思是,尝试确定该值仍会产生一些值,而不是……不采取任何行动。所以这个值必须来自一些内存,分配为存储仍然不确定的值,我非常怀疑编译器实际上会使用随机数生成器只是为了想出一些任意值。

最佳答案

不确定的事实不仅意味着它在第一次读取时不可预测,还意味着不能保证它是稳定的。这意味着两次读取同一个未初始化的变量并不能保证产生相同的值。因此,您无法通过阅读来真正“确定”该值。 (请参阅 DR#260 了解 2004 年关于该主题的初步讨论和 DR#451 在 2014 年重申该立场。)

例如,变量a 可能会被指定在某个时间范围内占用CPU 寄存器R1(而不是内存位置)。为了建立最佳的变量到寄存器分配时间表,“对象生命周期”的语言级概念不够精确。 CPU 寄存器由基于更精确的“值(value)生命周期”概念的优化编译器管理。当一个变量被分配一个确定的值时,值的生命周期就开始了。当最后一次读取先前分配的确定值时,值生命周期结束。值生命周期决定了变量与特定 CPU 寄存器相关联的时间范围。在指定的时间范围之外,同一寄存器 R1 可能与完全不同的变量 b 相关联。尝试在其值生命周期之外读取未初始化的变量 a 实际上可能会导致读取变量 b,这可能正在积极变化。

在此代码示例中

{
int i, j;

for (i = 0; i < 10; ++i)
printf("%d\n", j);

for (j = 0; j < 10; ++j)
printf("%d\n", 42);
}

编译器可以很容易地确定即使 ij 的对象生命周期重叠,值生命周期根本不重叠,这意味着 ij 可以分配给同一个 CPU 寄存器。如果发生类似的事情,您可能会很容易地发现第一个循环在每次迭代中打印不断变化的 i 值。这与 j 的值不确定的想法完全一致。

请注意,此优化不一定需要 CPU 寄存器。再举一个例子,一个关注保留宝贵堆栈空间的智能优化编译器可能会分析上述代码示例中的值生命周期并将其转换为

{
int i;

for (i = 0; i < 10; ++i)
printf("%d\n", <future location of j>);
}

{
int j;

for (j = 0; j < 10; ++j)
printf("%d\n", 42);
}

变量 ij 在不同时间占据内存中的相同位置。在这种情况下,第一个循环可能会在每次迭代时再次打印 i 的值。

关于C - 不确定值是不确定的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17394907/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com