C ++中的声明点

时间:2013-04-01 15:26:28

标签: c++

为什么在我将之前的101分配给新x时输出x

int x = 101;
{
    int x = x;
    std::cout << x << std::endl;
}

输出(垃圾):

  

422634

我认为第二个x会初始化为101,但未初始化。

注意:此案例中的解决方案是int x = ::x,但问题是为什么会发生。

3 个答案:

答案 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);