C++ 值是什么​;这段代码中的变量a和b是什么? #包括 结构向量2 { int x,y; }; 结构向量4 { 公众: 联盟 { 结构 { 整数x,y,z,w; }; 结构 { 向量2a,b; }; }; }; 无效打印向量(常量向量2和向量) { std::cout

C++ 值是什么​;这段代码中的变量a和b是什么? #包括 结构向量2 { int x,y; }; 结构向量4 { 公众: 联盟 { 结构 { 整数x,y,z,w; }; 结构 { 向量2a,b; }; }; }; 无效打印向量(常量向量2和向量) { std::cout,c++,visual-c++,c++17,C++,Visual C++,C++17,初始化{1,2,3,4}使联合中的第一个结构成为活动成员 语句vector4.x=1;有效,因为您正在操作活动成员的元素 读取vector4.a的行为是未定义的,因为联合中的第二个结构不是活动成员 在C++中不允许通过“联盟< /代码>类型的双关”。换句话说,代码> a < /> >和 b>代码>没有值。 技术上,这是未定义的行为,但大多数编译器将支持它(): 从非最近编写的联合成员中读取是一种未定义的行为。许多编译器将读取联合的非活动成员作为非标准语言扩展实现 下面是一个简单的示例,说明了相同

初始化
{1,2,3,4}
使
联合中的第一个
结构成为活动成员

语句
vector4.x=1;
有效,因为您正在操作活动成员的元素

读取
vector4.a
的行为是未定义的,因为
联合中的第二个
结构
不是活动成员


在C++中不允许通过“<代码>联盟< /代码>类型的双关”。换句话说,<>代码> a < /> >和<代码> b>代码>没有值。

技术上,这是未定义的行为,但大多数编译器将支持它():

从非最近编写的联合成员中读取是一种未定义的行为。许多编译器将读取联合的非活动成员作为非标准语言扩展实现

下面是一个简单的示例,说明了相同的概念,没有额外的结构:

#include<iostream>
struct Vector2
{
    int x, y;
};
struct Vector4
{
public:
    union
    {
        struct
        {
            int x, y, z, w;
        };
        struct
        {
            Vector2 a, b;
        };
    };
};
void PrintVector(const Vector2& vector)
{
    std::cout << vector.x << ", " << vector.y << std::endl;
}
int main()
{
    Vector4 vector4 = { 1,2,3,4 };
    vector4.x = 50;
    PrintVector(vector4.a);
    std::cin.get();
}
联合示例联合{
INTA;
int b;
};
int main()
{
例e;
e、 a=1;
//这将打印1,因为b与a占用相同的内存。

STD::虽然这个技巧并不少见,而且似乎在过去,在一个或其他编译器中是有效的。我相信它是用来提供类似的东西的。有时候,C++中的类型禁止是非常有害的。函数忽略vector4.a并执行函数的内容?@SeungYup26未定义的行为意味着它没有定义(关于语言标准)什么
PrintVector()
实际上是这样。它最多可以打印一个包含
vector4.x
vector4.y
内容的Vector2。它也可以打印任何内容或崩溃。
union ExampleUnion {
  int a;
  int b;
};

int main() 
{
  ExampleUnion e;
  e.a = 1;
  // This will print 1, since b occupies the same memory as a.
  std::cout << e.b << std::endl;
}