101
当我将以前的分配x
给新的时,为什么没有输出x
?
int x = 101;
{
int x = x;
std::cout << x << std::endl;
}
输出(垃圾):
422634
我以为第二个x
会被初始化,101
但它没有被初始化。
注意:这种情况下的解决方案是,int x = ::x
但问题是它为什么会发生。
101
当我将以前的分配x
给新的时,为什么没有输出x
?
int x = 101;
{
int x = x;
std::cout << x << std::endl;
}
输出(垃圾):
422634
我以为第二个x
会被初始化,101
但它没有被初始化。
注意:这种情况下的解决方案是,int x = ::x
但问题是它为什么会发生。
名称的声明点紧接在其完整声明符之后和初始化器之前... [C++ 标准 § 3.3.2/1]
当编译器对声明器足够了解时,它会完成声明。
上面的代码等于下面的代码:
int x = 101;
{
int x;
x = x; <------------------// Self assignment, assigns an indeterminate value.
std::cout << x << std::endl;
}
因为,inner 的声明在x
之前完成=
(赋值)
int x = x; <--// Now, we have the new `x` which hides the older one,
^ // so it assigns itself to itself
|
+---// Point of declaration,
// here compiler knows everything to declare `x`.
// then declares it.
另一方面,当我们声明复杂对象时,声明的点就更远了。所以,行为是不同的。
例如,下面的代码是可以的
const int i = 2;
{
int i[i];
^
|
+----// Point of declaration
// compiler has to reach to "]"
// therefore before declaring `i` as an array
// there is just one `i`, the `i` of `const int i=2`
}
在上面的代码中,编译器必须知道数组的实际大小才能完成声明,所以声明点是]
. 因此,i
内部[i]
是外部i
,因为尚未完成i
of的声明。因此,它声明了一个包含元素 ( )int i[...
的数组。2
int i[2];
此外,此示例显示了枚举数的声明点
const int x = 12;
{
enum { x = x };
^
|
+---// Point of declaration
// compiler has to reach to "}" then
// there is just one `x`, the `x` of `const int x=12`
}
枚举器用x
常量 的值初始化x
,即12
。
还有另一种方法。
#include <iostream>
int x = 101;
int main()
{
int x = ::x;
std::cout << x << std::endl;
std::cin.get();
}
变量作用域前面的 x 会被覆盖。诠释 x = x; 这一项有两个过程。一:int x;(定义变量x并分配内存并指定初始值:x = 0); 这一刻,前面的 x 将被隐藏。二:x = x;(没有找到x的值);