C++ 为什么我会得到C程序的垃圾值?
如果我用GCC/Clang编译下面的C代码,为什么会得到垃圾值? 注意,如果我只是在内部范围中打印x的值,我会得到预期的结果C++ 为什么我会得到C程序的垃圾值?,c++,c,scope,initialization,declaration,C++,C,Scope,Initialization,Declaration,如果我用GCC/Clang编译下面的C代码,为什么会得到垃圾值? 注意,如果我只是在内部范围中打印x的值,我会得到预期的结果 #include<stdio.h> int main() { int x = 5; { int x = x; printf("%d", x); } return 0; } #包括 int main() { int x=5; { int x=x; printf(“%d”,x); } 返回0; }
#include<stdio.h>
int main()
{
int x = 5;
{
int x = x;
printf("%d", x);
}
return 0;
}
#包括
int main()
{
int x=5;
{
int x=x;
printf(“%d”,x);
}
返回0;
}
声明intx=5代码>不在第二个块的范围内。这意味着变量x
在下面的代码段中
{
int x = x;
printf("%d", x);
}
与main中声明的外部变量x
不同。因此,当您尝试在赋值中访问它的值时,它会给出一个垃圾值,因为它以前不在这个范围内,因此在这个声明中它没有初始化
int x = x;
标识符x
的声明点位于声明符的完整定义之后,即x
在赋值符号=
之前已经可见,并隐藏在外部块范围中声明的同名变量
您可以将未初始化的x
分配给它自己。因此,它有一个不确定的值
你可以这样想象
int x;
x = x;
<> >在C++标准(3.3.2点声明)中存在完全相同的示例
1名称的声明点紧随其名称之后
完整声明人(第8条)及其初始值设定人(如有)之前,
除非下文另有说明。[示例:
这里,第二个x用它自己的(不确定)值初始化。
-[结束示例]
C标准中规定了(6.2.1标识符范围)
7结构、联合和枚举标记的作用域刚开始
在声明
标签。每个枚举常量的作用域都在
其定义枚举数在枚举数列表中的外观任何
另一个标识符的作用域在
它的声明器。
请注意枚举数的定义。枚举数的规则不同
此程序格式良好,枚举器x
将由外部范围中声明的变量x
初始化(而枚举器y
将由前面的枚举器x
初始化)
范围中的x
是x
,而不是x
。(可能)取下intx=5代码>行,代码中没有任何更改。永远不会访问x
。
int x = 12;
{ int x = x; }
#include <iostream>
int main()
{
const int x = 10;
{
enum E { x = x + 1, y = x };
std::cout << "E::x = " << x << ", E::y = " << y << std::endl;
}
std::cout << "x = " << x << std::endl;
}
E::x = 11, E::y = 11
x = 10