C+;中for循环迭代语句期间作用域中的变量+; 根据我对C++规范的理解(根据在线草案标准),可以用while循环和块初始化来修改for循环。根据我的理解,for循环的迭代语句发生在与主体相同的范围内,因此它应该能够使用for循环主体中声明的变量。gcc和clang都拒绝以下(人为的)代码,这是我真实代码的简化

C+;中for循环迭代语句期间作用域中的变量+; 根据我对C++规范的理解(根据在线草案标准),可以用while循环和块初始化来修改for循环。根据我的理解,for循环的迭代语句发生在与主体相同的范围内,因此它应该能够使用for循环主体中声明的变量。gcc和clang都拒绝以下(人为的)代码,这是我真实代码的简化,c++,scope,language-lawyer,specifications,C++,Scope,Language Lawyer,Specifications,显然,我可以通过在循环之外声明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 scop

显然,我可以通过在循环之外声明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;
 }
intmain()
{

对于(inti=0;i
for(inti=0;i
for(inti=0;i这在某种程度上是显而易见的。我给你举个例子。你能这样写吗?

int main(){
int i = j * 10;
//Some other lines ...
int j = 2;
return 0;
}
当然,在给定的代码中,i和j在同一范围内,但在使用j之前,必须声明它。

除了范围之外,你还得考虑其他事情。

< P>这是很明显的。我给你举个例子。你能写下这样的东西吗?< BR>

int main(){
int i = j * 10;
//Some other lines ...
int j = 2;
return 0;
}
当然,在给定的代码中,i和j在同一范围内,但在使用j之前,必须声明它。

除了范围之外,您还必须考虑其他事项。参考文献

< P>,扩展如下:(第5.5.3/1)。for循环语句:

for (init cond; expr) statement
相当于:

{
    init
    while (cond)
    {
        statement
        expr;
    }
}

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

for (init cond; expr) statement
相当于:

{
    init
    while (cond)
    {
        statement
        expr;
    }
}


<> P>你之所以会出错是因为在j里面声明了/j,但是在C++编译器中从左到右,从上到下编译,所以当编译器遇到“i”被垃圾值所影响时,它会弹出一个错误。

你之所以出错是因为在循环中声明了/j,但是C++中编译器从左到右、从上到下编译,因此当编译器遇到“i”被垃圾值忽略时,它会弹出一个错误。

i=j
中使用
j
后,您正在声明
j
…while循环不会这样做。这是无效的语法,因为
j
是在
for>内部才声明的>循环,虽然在第一个循环完成之前它没有被使用。@nhahtdh,这就是我的意思。编译器还没有看到声明。在这方面何时使用它是无关紧要的。@chris:我的评论比你晚了一点,所以它会通知你。但它不是针对你的。@nhahtdh,啊,我把它错当成了“使用”这个词上的学究,尽管如此,这是正确的。在
i=j
中使用
j
后,您正在声明
j
。while循环不会这样做。这是无效的语法,因为
j
直到
for
循环内部才声明,尽管在第一个循环完成之前没有使用它。@nhahdh,这就是我的意思。编译器没有看到声明然而,在这方面,当它被使用时是无关紧要的。@chris:我的评论比你晚了一点,所以它会通知你。虽然它不是针对你的。@nhahtdh,啊,我把它错认为是“使用”这个词上的迂腐,尽管如此,这是正确的。感谢您的回复。我同意您编写的代码与for循环等效,但我参考的标准草案进一步将您的代码重写为我在上面编写的while循环(,第111页)。在while循环版本中,j显然在范围内。我认为您的答案实际上是正确的。我应该将代码转换为{int I=0;而(i@GManNickG第110页,第6.5节第2段。“如果迭代语句中的子语句是单个语句而不是复合语句,就好像它被重写为包含原始语句的复合语句一样。"这个答案听起来好像第一个代码段在语法上是不正确的,尽管它是正确的。但是,正如John对我的参考答案所作的评论,§6.5/2指出迭代语句周围有一个隐式的块作用域。@GManNickG我的代码段在语法上是有效的,你当然是对的,但Anders的答案似乎是最接近的。我没有在重写到while循环表单之前,执行主体的重写。感谢您的回复。我同意您编写的代码与for循环等效,但我参考的标准草案进一步将您的代码重写到我上面编写的while循环(,第111页)。在while循环版本中,j显然在范围内。我认为您的答案实际上是正确的。我应该将代码转换为{int I=0;而(i@GManNickG第110页,第6.5节第2段。“如果迭代语句中的子语句是单个语句而不是复合语句,就好像它被重写为包含原始语句的复合语句一样。"这个答案听起来好像第一个代码段在语法上是不正确的,尽管它是正确的。但是,正如John对我的参考答案所作的评论,§6.5/2指出迭代语句周围有一个隐式的块作用域。@GManNickG我的代码段在语法上是有效的,你当然是对的,但Anders的答案似乎是最接近的。我没有在重写while循环形式之前执行对正文的重写。在他的代码中没有发生同样的情况,在扩展中循环表达式是在语句之后。好的,我修复了它。但是,除了范围之外,他还必须考虑其他的事情。在他的代码中也没有发生同样的事情。在扩展中,循环表达式是在语句之后。好吧,我把它固定了。但是,他必须考虑范围之外的其他事情。是的,我误解了“陈述”的性质。具体地,我必须把它放在一个块中,根据6.5个子陈述2.是的。我误解了“陈述”的性质。具体地,我必须按照6.5个子语句2将它括在一个块中。