为什么以下代码在g ++下编译时没有任何警告或错误? 我看到的问题是第一行中定义的变量x可以在if范围内访问,但尽管它再次被重新定义。
int main() {
int x = 5;
std::cout << x;
if (true) {
int x = 6;
std::cout << x;
}
}
答案 0 :(得分:5)
根据C
-
C99中的6.2.1:
如果声明标识符的声明符或类型说明符出现在块内或函数定义中的参数声明列表中,则标识符具有块作用域,该作用域终止于关闭相关块的}
...
如果词法相同的标识符的外部声明存在于同一名称空间中,则它将被隐藏,直到当前作用域终止,之后它再次变为可见。
在C和C ++中,在多个范围内使用相同的名称是合法的。
因此,在您的代码中,前一个i
保持隐藏,直到if
语句的范围终止。
答案 1 :(得分:1)
C ++标准允许名称隐藏,这意味着您可以在嵌套作用域中声明具有相同标识符的任何内容。
来自N4296:
3.3.10名称隐藏[basic.scope.hiding]
列表的
- 可以通过在嵌套声明性区域或派生类中显式声明该名称来隐藏名称。
- 类名(9.1)或枚举名称(7.2)可以通过声明的变量,数据成员,函数或枚举器的名称隐藏 相同的范围。如果是类或枚举名称和变量,则为数据 成员,函数或枚举器在同一范围内声明(在任何范围内) order)具有相同的名称,隐藏类或枚举名称 变量,数据成员,函数或枚举器名称的位置 可见。
- 在成员函数定义中,块作用域中名称的声明隐藏了具有相同成员的类的成员声明 名称;见3.3.7。派生类中成员的声明 (第10条)隐藏了一个基类成员的声明 一样的名字;见10.2。
- 在查找由命名空间名称限定的名称时,将使用using-directive使这些声明可见 可以通过命名空间中具有相同名称的声明隐藏 包含使用指令;见(3.4.3.2)。
- 如果名称在范围内且未隐藏,则称其可见
醇>
1项是您所需要的。
答案 2 :(得分:0)
第二个x
变量具有块范围,并且隐藏了之前的x
声明。
答案 3 :(得分:0)
您用于在代码的最后一行打印的x
属于if
块。此x
隐藏了第一行中声明的第一个x
。这是因为范围。
int main() {
int x = 5; //Accessble throughout the main.
std::cout << x;
if (true) {
int x = 6; //Local to this if block. Not accessible outside if block
std::cout << x; //Prints local x's value
}
}