33

101当我将以前的分配x给新的时,为什么没有输出x

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

输出(垃圾):

422634

我以为第二个x会被初始化,101 但它没有被初始化。

注意:这种情况下的解决方案是,int x = ::x但问题是它为什么会发生。

4

3 回答 3

45

申报点

名称的声明点紧接在其完整声明符之后和初始化器之前... [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,因为尚未完成iof的声明。因此,它声明了一个包含元素 ( )int i[...的数组。2int 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

于 2013-04-01T15:26:28.280 回答
9

还有另一种方法。

#include <iostream>
int x = 101;
int main()
{
  int x = ::x;
  std::cout << x << std::endl;
  std::cin.get();
}
于 2013-04-01T15:39:00.780 回答
0

变量作用域前面的 x 会被覆盖。诠释 x = x; 这一项有两个过程。一:int x;(定义变量x并分配内存并指定初始值:x = 0); 这一刻,前面的 x 将被隐藏。二:x = x;(没有找到x的值);

于 2013-04-01T16:29:27.163 回答