2016-06-07 86 views
1

我发现了一个奇怪的错误(如果这实际上是一个错误)。您可以稍后在同一范围内重新声明一个变量,而您已经可以使用第一个相同的命名变量。这是正常的吗?允许重新申报吗?

此代码编译和工作没有任何错误/警告。我正在使用代码块编译g ++。

int main() 
{ 
    int test = 0; 
    if(1) 
     int test = 0; 
    return 0; 
} 
+6

这不是一样的范围。范围不是简单的“数”和“}”。 – hvd

+0

噢,我的不好。但这是正常的吗?这根本不是问题,还是它?我的意思是,如果你在另一个函数中声明它们,我可以理解,但在这里,你仍然可以访问第一个变量。如何以及为什么这是允许的? – Neox

+1

是的。这是正常的。 – Heto

回答

2

此代码:

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

是的我知道了,但是你仍然可以访问第一个变量,而第二个变量被重新声明... – Neox

+0

@Neox查看我的编辑 –

2

它们不在同一个范围内。您没有在单个语句(而不是复合语句)周围放置花括号statement_true并不意味着if不会创建新的作用域。

参见:http://en.cppreference.com/w/cpp/language/if

+0

嗯,我知道如果你不放大括号,只读下一行仿佛有大括号。我无法理解的是没有警告的重新宣布。但无论如何,我得到了我的答案。谢谢。 – Neox

1

请尝试以下方法看到if创造了一个新的范围:

int main() 
{ 
    int test = 0; 
    if(1) 
     int test = 1; 
    cout << test; 
    return 0; 
} 

因此,这是不是一个错误,这是每specification

1

该标准允许相同命名变量存在于不同的作用域中,并且它定义了在作用域内使用它们时将引用哪个变量的规则。相同的命名变量会隐藏(遮蔽)更高级别作用域中的变量。

L.E:Variable Shadowing