变量的重新声明

Redeclaration of a variable

请考虑以下代码。

代码 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

为什么会这样?

它们不一样。

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 两次,这是不允许的。

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

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;
}

但确实没有理由这样做。