我发现了一个奇怪的错误(如果这实际上是一个错误)。您可以稍后在同一范围内重新声明一个变量,而您已经可以使用第一个相同的命名变量。这是正常的吗?允许重新申报吗?
此代码编译和工作没有任何错误/警告。我正在使用代码块编译g ++。
int main()
{
int test = 0;
if(1)
int test = 0;
return 0;
}
我发现了一个奇怪的错误(如果这实际上是一个错误)。您可以稍后在同一范围内重新声明一个变量,而您已经可以使用第一个相同的命名变量。这是正常的吗?允许重新申报吗?
此代码编译和工作没有任何错误/警告。我正在使用代码块编译g ++。
int main()
{
int test = 0;
if(1)
int test = 0;
return 0;
}
此代码:
if(1)
int test = 0;
等于:
if(1){
int test = 0;
}
所以它的作用范围的一部分。并且if
内部的test
与范围之外的不一样。
您可以不是访问外部test
变量。
int main()
{
int test = 0;
if(1){
int test = 5;
std::cout << "Inner:" << test<< "\n";
//you can not access the outer test
}
return 0;
}
是的我知道了,但是你仍然可以访问第一个变量,而第二个变量被重新声明... – Neox
@Neox查看我的编辑 –
它们不在同一个范围内。您没有在单个语句(而不是复合语句)周围放置花括号statement_true并不意味着if
不会创建新的作用域。
嗯,我知道如果你不放大括号,只读下一行仿佛有大括号。我无法理解的是没有警告的重新宣布。但无论如何,我得到了我的答案。谢谢。 – Neox
请尝试以下方法看到if
创造了一个新的范围:
int main()
{
int test = 0;
if(1)
int test = 1;
cout << test;
return 0;
}
因此,这是不是一个错误,这是每specification
该标准允许相同命名变量存在于不同的作用域中,并且它定义了在作用域内使用它们时将引用哪个变量的规则。相同的命名变量会隐藏(遮蔽)更高级别作用域中的变量。
这不是一样的范围。范围不是简单的“数”和“}”。 – hvd
噢,我的不好。但这是正常的吗?这根本不是问题,还是它?我的意思是,如果你在另一个函数中声明它们,我可以理解,但在这里,你仍然可以访问第一个变量。如何以及为什么这是允许的? – Neox
是的。这是正常的。 – Heto