考虑以下代码:
int l;
int k;
for (int i=0; i < 2; ++i)
{
int j;
if (i == 0) l = j;
if (i == 1) k = j;
}
assert (l == k);
断言成立吗?有趣的是,未初始化的变量是否可以在不同的迭代中取不同的值。
一些玩弄 LLVM 的人表明断言实际上确实成立:这实际上是由标准保证的,还是它是未定义的,并且它以 LLVM 编译器实现它的方式发生?
考虑以下代码:
int l;
int k;
for (int i=0; i < 2; ++i)
{
int j;
if (i == 0) l = j;
if (i == 1) k = j;
}
assert (l == k);
断言成立吗?有趣的是,未初始化的变量是否可以在不同的迭代中取不同的值。
一些玩弄 LLVM 的人表明断言实际上确实成立:这实际上是由标准保证的,还是它是未定义的,并且它以 LLVM 编译器实现它的方式发生?
至于你想要做什么: 的价值j
是不确定的。它只是声明时发生在堆栈上的任何内容,因此断言不一定成立。
编辑:有人指出,由于j
每次分配时都可能在堆栈上的同一个位置,该值的预期行为是什么?
相同的事实只是实现的事实。该标准规定:
6.2.4对于这样一个没有可变长度数组类型的对象,它的生命周期从进入与其关联的块开始,直到该块的执行以任何方式结束。(进入封闭的块或调用函数会暂停,但不会结束当前块的执行。)如果递归地进入块,则每次都会创建一个新的对象实例。对象的初始值是不确定的。如果为对象指定了初始化,则在执行块时每次到达声明时都会执行该初始化;否则,每次达到声明时,该值变得不确定。
这是不确定的。
编辑2:那是C标准。从 C++:
6.7具有自动存储持续时间(3.7.2)的变量在每次执行其声明语句时都会被初始化。在块中声明的具有自动存储持续时间的变量在退出块时被销毁(6.6)。