3.17.2 1 indeterminate value either an unspecified value or a trap representation
根据google,不确定的定义是:
>不确定,已知或成立
遗憾的是模糊.
根据自由语言,可确定的是:
>能够被确定
根据merriam-webster,确定(在具体情况下)是:
通过调查,推理或计算找出或做出决定
因此,常识表明即使在编译期间不确定的值是未知的,它在运行时也是完全可以确定的.您可以随时阅读占用内存位置的所有内容.
还是我错了?如果是这样,为什么?
编辑:为了澄清,我发布了这个与一个用户试图说服我一个不确定的价值是不可确定的用户的热烈争论,我非常怀疑.
编辑2:为了澄清,“可确定”我不意味着一个稳定或可用的值,即使它是未初始化内存的垃圾值,仍然可以确定该垃圾的值.我的意思是试图确定这个价值还是会产生一些价值而不是…没有行动.所以这个值必须来自一些内存,分配为仍然不确定值的存储空间,我非常怀疑编译器实际上会使用一个随机数生成器来提出一些任意值.
解决方法
例如,变量a可以被分配占用cpu寄存器R1,具有一定的时间帧(而不是存储器位置).为了建立最佳的变量到寄存器分配调度,“对象生存期”的语言层次概念不够精确.基于更为精确的“价值生命周期”概念,cpu寄存器由优化编译器管理.当一个变量被分配一个确定的值时,值的生命周期就会开始.当最后一次读取先前分配的确定值时,寿命结束.值生存期确定变量与特定cpu寄存器相关联的时间范围.在该分配的时间范围之外,相同的寄存器R1可能与完全不同的变量b相关联.尝试读取未初始化的变量超出其值的生命周期可能实际上会导致读取变量b,这可能正在主动更改.
在这个代码示例中
{ int i,j; for (i = 0; i < 10; ++i) printf("%d\n",j); for (j = 0; j < 10; ++j) printf("%d\n",42); }
编译器可以很容易地确定即使i和j的对象生命周期重叠,这个值的生命周期根本不重叠,这意味着i和j可以分配给同一个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); }
变量i和j在不同时间占用内存中相同的位置.在这种情况下,第一个循环可能会再次结束在每次迭代时打印i的值.