为什么在GCC 4.9.2中编译以下代码时会出错?

时间:2015-09-14 18:50:13

标签: c++

int main() {
    int T;
    cin>>T;
    for(int i = 0 ; i < T ; ++i) {
        cin>>a[i];
    }
    /*error:prog.cpp:41:6: error: name lookup of 'i' changed for ISO 'for' scoping [-fpermissive]*/
    for(i = 0 ; i < T ; ++i) {
        cout<<Z(a[i])<<'\n';
    }
    return 0;
}

当我在第二个for循环中的int之前添加i时,代码运行完美。

注意:a[]Z()是在main()之前定义的。

我是GCC 4.9.2的新手。到目前为止我使用过Turbo C ++。

2 个答案:

答案 0 :(得分:5)

很久以前,在C ++中你的代码是合法的。在循环之后,for循环中声明的i之类的标识符仍然可见。

改变了,到1998年C ++标准化时,for循环中声明的变量的范围只是循环的主体。

您的代码旨在与旧系统一起使用,编译器告诉您不再允许这样做。

在第二个循环中将for (i =替换为(for int i =,您就完成了。 (现在你有两个不同的变量叫i而不是一个。)

答案 1 :(得分:4)

如果i仅存在于for循环的范围内,则声明。一旦退出,您将丢失i声明,除非您在后续循环中重新声明它,否则无法重复使用它。

for(int i = 0 ; i < T ; ++i) {
    cin>>a[i];
} // scope of i ends here

for(i = 0 ; i < T ; ++i) { // loop has no idea what i is now
    cout<<Z(a[i])<<'\n';
}