2

根据我对C++规范的理解(根据网上的标准草案),for循环可以重写为while循环和初始化块。根据我的理解,for-loop的迭代语句和body发生在同一个作用域,所以应该可以使用for-loop的body中声明的变量。gcc 和 clang 都拒绝以下(人为的)代码,这是我真实代码的简化。

我显然可以通过在循环之外声明 j 来修复代码,但是为什么 j 超出了下面的范围?

int main() 
{
    for(int i=0; i<10; i=j) int j=i+1;

    // // I must misunderstand the standard because I thought the above loop is 
    // // equivalent to the commented code below where j is clearly in scope.
    // {
    //     int i=0;
    //     while(i<10) {
    //         int j=i+1;
    //         i=j;
    //     }
    // }

    return 0;
 }

根据clang(和gcc),这是无效的。

test.cpp:3:26: error: use of undeclared identifier 'j'
    for(int i=0; i<10; i=j) int j=i+1;
                         ^
1 error generated.
4

4 回答 4

3
for(int i=0; i<10; i=j) int j=i+1;

如果它是有效的语法,将与

for(int i=0; i<10; i=j) 
{
  int j=i+1;
}

{}然后 for 循环在执行第一个循环之前不存在的范围内访问“j” 。C++ 是一种静态语言,它依赖于编译器能够在编译时解析其变量,但您正在做的是试图让它在运行时解析变量。

于 2012-07-11T05:02:04.383 回答
1

作为参考,扩展如下(§6.5.3/1)。for循环语句:

for (init cond; expr) statement

相当于:

{
    init
    while (cond)
    {
        statement
        expr;
    }
}
于 2012-07-11T05:16:49.203 回答
0

这在某种程度上是显而易见的。我给你举个例子。你能写出这样的东西吗?

int main(){
int i = j * 10;
//Some other lines ...
int j = 2;
return 0;
}

当然在给定的代码中 i 和 j 是在同一个范围内,但是在使用 j 之前你必须声明它。
除了范围之外,您还必须考虑其他事情。

于 2012-07-11T05:02:26.983 回答
0

您收到错误的原因是因为在 for 循环中声明/初始化了“j”。但是在 C++ 编译器从左到右和从上到下编译,所以当编译器遇到 'i' 被分配了一个垃圾值时,它会弹出一个错误。

于 2012-07-11T05:21:55.427 回答