循环中未初始化的局部变量每次迭代都会具有相同的值吗?

时间:2013-02-02 23:46:28

标签: c++

考虑以下代码:

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

1 个答案:

答案 0 :(得分:3)

至于你尝试做什么:j的值是不确定的。它只是在声明时发生在堆栈上的任何事情,因此断言不一定保持。


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

它是相同的事实只是实施的事实。标准规定:

  

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

这是不确定的。

编辑2 :这是C标准。来自C ++:

  

6.7 每个都会初始化具有自动存储持续时间(3.7.2)的变量   他们的声明 - 陈述被执行的时间。变量与   在块中声明的自动存储持续时间在退出时被销毁   从块(6.6)。