重新声明变量

时间:2018-01-14 19:45:59

标签: c++ for-loop compiler-errors declaration

请考虑以下代码。

代码1

using namespace std;
int main ()
{
    for (int ii = 0; ii < 2; ii++)
    {
        int a = 0;
    }
    return 0;
}

代码2

using namespace std;
int main ()
{
    int a = 0;
    int a = 0;
    return 0;
}

似乎这两个代码是等价的。但是,当我运行第二个时,会报告以下错误:

[Error] redeclaration of 'int a'
[Error] 'int a' previously declared here

为什么会这样?

2 个答案:

答案 0 :(得分:1)

变量可以在内部范围内重新声明。这称为 shadowing 。但是,您要做的是重新声明相同范围内的变量。

for (...) {
  int a = 0;
}

这会多次创建变量a。在每次迭代结束时,变量将被释放并创建一个新变量。

int a = 0;
for (...) {
  int a = 1;
}

这是类似的。第二个a是一个仅存在于循环内部的新变量。循环结束后,原始a又回来了,仍然有值0

int a = 0;
int a = 1;

在这里,我们尝试在同一范围内创建两个具有相同名称的变量。 C ++标准明确禁止这一点。没有机械原因必须禁止这一点,但由于几乎没有理由你想要故意这样做,标准禁止它,因为你更有可能打算做出任务。如果您确实需要两个具有相同名称的变量,则可以使用显式块。

int a = 0;
{
  int a = 1;
}

但实际上没有理由这样做。

答案 1 :(得分:0)

他们不一样。

using namespace std;
int main ()
{
    for (int ii = 0; ii < 2; ii++)
    {
        int a = 0;
    }
    return 0;
}

在此您声明并初始化变量a一次。然后在循环体再次执行时将其销毁并重新创建。

using namespace std;
int main ()
{
    int a = 0;
    int a = 0;
    return 0;
}

在此,您在同一范围内声明并初始化变量a两次,这是不允许的。