【发布时间】:2020-09-18 08:16:28
【问题描述】:
如下代码
#include <iostream>
using namespace std;
union type
{
int a;
char b ;
};
int main()
{
type first;
first.b = 'a';
cout << first.a << " " << first.b << endl;
}
输出为-858993567 a (MSVC) 或4201057 a(g++ MINGW)。
但对于
#include <iostream>
using namespace std;
union type
{
int a;
char b ;
};
int main()
{
type first;
first.a = 0;
first.b = 'a';
cout << first.a << " " << first.b << endl;
}
输出是97 a
并且这些值在任何情况下都是固定的(尝试重新启动并创建新的工作区/文件,因此不是垃圾值)。
那么,为什么初始化(在第二种情况下)会产生影响?
我在visual studio(使用MSVC)和visual studio code(使用g++)上都试过了。
更新 1
我检查了可能使用 Linux g++ 的在线 IDE,在这两种情况下,它们都给出了确切的预期答案,即97 a。
【问题讨论】:
-
您的程序表现出未定义的行为,通过在对象的生命周期开始之前访问对象(联合的非活动成员)。
-
@Ron 检查更新 1
-
@IgorTandetnik 检查更新 1
-
未定义的行为是未定义的。 “似乎有效”是未定义行为的一种可能表现形式。
-
“确切的预期答案”不存在,因为您的程序具有未定义的行为。
标签: c++ visual-c++ g++ msvc12