范围规则:在相同作用域中具有相同名称的两个变量

时间:2018-10-02 14:02:12

标签: c++

我在Mac OS和Redhat(g ++ 6.3.1)的文件“ test.cpp”中尝试了此操作: g ++ -Wall -Wextra -Wconversion -pedantic -o test test.cpp

#include <iostream>
int main()
{
    int a = 777;
    for (int k = 0; k < 2; ++k) {
        a = 111;      // external a
        int a = 0;    // internal a 
        for (int j = 0; j < 3; ++j) a += j + k;
        std::cout << "internal a: " << a << std::endl;
    }
    std::cout << "external a: " << a << std::endl;
}

输出: 内部A:3 内部A:6 外部A:111

问题为什么要编译?我一直认为(超过20年)C ++中的范围界定规则非常严格(永远如此)。显然,在相同范围内存在两个类似命名的变量“ a”。该示例来自我在其中出错的真实代码。

1 个答案:

答案 0 :(得分:2)

它们不在同一范围内。这称为variable shadowing,并且是合法的(但通常会被带有-WShadow的编译器警告)。