请考虑以下代码。
代码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
为什么会这样?
答案 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
两次,这是不允许的。