C++ C+中的声明点+;

C++ C+中的声明点+;,c++,C++,当我将以前的x分配给新的x时,为什么输出不是101 int x = 101; { int x = x; std::cout << x << std::endl; } intx=101; { int x=x; std::cout申报点 名称的声明点在其完成后立即出现 声明符及其初始值设定项之前…[C++标准§3.3.2/1] 编译器在充分了解声明器时完成声明 上述代码等于以下代码: int x = 101; { int x; x = x; <

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

int x = 101;
{
    int x = x;
    std::cout << x << std::endl;
}
intx=101;
{
int x=x;
std::cout申报点
名称的声明点在其完成后立即出现
声明符及其初始值设定项之前…[C++标准§3.3.2/1]

编译器在充分了解声明器时完成声明

上述代码等于以下代码:

int x = 101;
{
  int x;
  x = x; <------------------// Self assignment, assigns an indeterminate value.
  std::cout << x << std::endl;
}

另一方面,当我们声明复杂对象时,声明点更远,因此,行为是不同的

例如,下面的代码就可以了

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的
i
的声明[…
尚未完成。因此,它声明了一个包含
2
元素(
inti[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();
}
#包括
int x=101;
int main()
{
int x=::x;
std::cout变量范围
前面的x将被覆盖。
int x=x;
这个有两个过程。
一:int x;(定义变量x并分配内存并指定初始值:x=0);
此时,前面的x将被隐藏。

二:x=x;(找不到值x);

我最近问过……最新的C++1y草稿也有这种未定义的行为,请参见。对,但问题是为什么,而不是如何解决它。@MM问题是“如果我将前一个x指定给新的x,为什么输出不是101?”-这个答案可以被看作是回答了一个问题:“因为你没有将名字限定为以下内容:”。在我看来,这是一个值得的答案,还有你的答案(这也是一个很好的答案)也许我们可以加上声明,当使用C++ 11代码> Audio<代码>关键字时,也可以完成,而且是一个错误,它是<代码>自动x= x/c> > Geoffroy:我已经提出了一个问题:<代码>自动x= x;< /C++ >当使用直接初始化器时(例如int x(x)),什么是声明点?微软Visual C++编译器(MSVC 2017)似乎把声明的重点放在了结尾处。@deepmax如果你是对的,那么GCC有一个问题,因为“int i(i)”编译时没有定义任何全局“i”。(唯一的警告是,我未初始化)@Tom:um,让我改变我的观点,如果
int i(i)
就像
inti=i;
那么MSVC就错了,不是吗?
#include <iostream>
int x = 101;
int main()
{
  int x = ::x;
  std::cout << x << std::endl;
  std::cin.get();
}