为什么在我将之前的101
分配给新x
时输出x
?
int x = 101;
{
int x = x;
std::cout << x << std::endl;
}
输出(垃圾):
422634
我认为第二个x
会初始化为101
,但未初始化。
注意:此案例中的解决方案是int x = ::x
,但问题是为什么会发生。
答案 0 :(得分:44)
名称的声明点在完成后立即生效 声明者和初始化器之前... [C ++标准§3.3.2/ 1]
编译器在完全了解声明器时完成声明。
以上代码等于以下代码:
int x = 101;
{
int x;
x = x; <------------------// Self assignment, assigns an indeterminate value.
std::cout << x << std::endl;
}
因为,内部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.
另一方面,当我们宣布复杂的对象时,声明点就更远了。所以,行为是不同的。
例如,下面的代码是OK
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
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
。
答案 1 :(得分:9)
还有另一种方法可以做到。
#include <iostream>
int x = 101;
int main()
{
int x = ::x;
std::cout << x << std::endl;
std::cin.get();
}
答案 2 :(得分:0)
变量范围 在x前面将被覆盖。 int x = x; 这一个有两个过程。 一:int x;(定义变量x并分配内存并指定初始值:x = 0); 这一刻,前面的x将被隐藏。 二:x = x;(不要找到值x);