C++ C++;联合,垃圾值

C++ C++;联合,垃圾值,c++,visual-c++,g++,msvc12,C++,Visual C++,G++,Msvc12,对于以下代码 #include <iostream> using namespace std; union type { int a; char b ; }; int main() { type first; first.b = 'a'; cout << first.a << " " << first.b << endl; } 输出为97 a 这些值在任何情况下都是固定的(尝试重新启动并

对于以下代码

#include <iostream>

using namespace std;

union type
{
    int a;
    char b ;
};

int main()
{
    type first;
    first.b = 'a';
    cout << first.a << " " << first.b << endl;

}
输出为
97 a

这些值在任何情况下都是固定的(尝试重新启动并创建新的工作区/文件,因此不是垃圾值)

那么,为什么初始化(在第二种情况下)会产生不同呢

我在VisualStudio(使用MSVC)和VisualStudio代码(使用g++)上都试过

更新1
我在可能使用Linux g++的在线IDE上进行了检查,他们给出了准确的预期答案,即在这两种情况下,
97 a

如果您在第一个代码示例中指定first.a,您将得到固定的、稳定的值


您有4个字节大小的union,并且只初始化其中的一个字节。

union类似于类型,可以保存任何类型,但必须在union的定义中写入此类型,如下所示:

union Example {

    char a;
    std::int32_t b;

};

Example ex; /// Create object of union
ex.a = 'c'; /// At this moment a member is valid and b is invalid
std::cout << ex.b; /// This cause undefined behavior
联合示例{
字符a;
标准:int32_t b;
};
示例ex;///创建并集对象
例如a='c';///此时,a成员有效,b无效

std::在对象(联合体的非活动成员)的生存期开始之前,您的程序是否会通过访问对象的方式显示未定义的行为。@Ron check update1@IgorTandetnik检查更新1未定义的行为是否未定义。“似乎有效”是未定义行为的一种可能表现形式。“确切的预期答案”不存在,因为您的程序具有未定义的行为。请检查update oneOk,Abhay。如果您计划只在在线IDE上编译和运行代码,您可以睡个好觉。但在其他情况下,您可以使用未定义的值获得未定义的行为。任何人都可以看出我写错了什么?
union Example {

    char a;
    std::int32_t b;

};

Example ex; /// Create object of union
ex.a = 'c'; /// At this moment a member is valid and b is invalid
std::cout << ex.b; /// This cause undefined behavior