-3

考虑以下代码:

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 编译器实现它的方式发生?

4

1 回答 1

3

至于你想要做什么: 的价值j是不确定的。它只是声明时发生在堆栈上的任何内容,因此断言不一定成立。


编辑:有人指出,由于j每次分配时都可能在堆栈上的同一个位置,该值的预期行为是什么?

相同的事实只是实现的事实。该标准规定:

6.2.4对于这样一个没有可变长度数组类型的对象,它的生命周期从进入与其关联的块开始,直到该块的执行以任何方式结束。(进入封闭的块或调用函数会暂停,但不会结束当前块的执行。)如果递归地进入块,则每次都会创建一个新的对象实例。对象的初始值是不确定的。如果为对象指定了初始化,则在执行块时每次到达声明时都会执行该初始化;否则,每次达到声明时,该值变得不确定。

这是不确定的。

编辑2:那是C标准。从 C++:

6.7具有自动存储持续时间(3.7.2)的变量在每次执行其声明语句时都会被初始化。在块中声明的具有自动存储持续时间的变量在退出块时被销毁(6.6)。

于 2013-02-02T23:48:29.957 回答