考虑以下代码:
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编译器实现它的方式发生的?
答案 0 :(得分:3)
至于你尝试做什么:j
的值是不确定的。它只是在声明时发生在堆栈上的任何事情,因此断言不一定保持。
编辑:有人指出,由于j
每次分配时可能位于堆栈的同一位置,因此该值的预期行为是什么?
它是相同的事实只是实施的事实。标准规定:
6.2.4 对于没有可变长度数组类型的对象,其生命周期从入口延伸到块中 它是关联的,直到该块的执行以任何方式结束。 (输入一个封闭的块或调用一个函数暂停,但确实如此 不结束,执行当前块。)如果输入了块 递归地,每次都创建对象的新实例。的的 对象的初始值是不确定的。如果初始化是 为对象指定的,每次声明时都会执行 在执行该块时达成;否则,价值变为 每次达到声明时都不确定。
这是不确定的。
编辑2 :这是C标准。来自C ++:
6.7 每个都会初始化具有自动存储持续时间(3.7.2)的变量 他们的声明 - 陈述被执行的时间。变量与 在块中声明的自动存储持续时间在退出时被销毁 从块(6.6)。