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();
}