C++ 为什么我会得到C程序的垃圾值?

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

如果我用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;
}

声明
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