这段代码中变量 a 和 b 的值是多少?

Posted

技术标签:

【中文标题】这段代码中变量 a 和 b 的值是多少?【英文标题】:What are the values ​of the variables a and b in this code? 【发布时间】:2020-10-16 10:11:40 【问题描述】:
#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();

在这段代码中,为什么a有x和y的值,而b有z和w的值?和联通有关系吗? 如果你知道,请告诉我。 谢谢

【问题讨论】:

【参考方案1】:

初始化 1,2,3,4 使union 中的第一个struct 成为活动成员

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

读取vector4.a 的行为未定义,因为union 中的第二个struct不是活动成员。

在 C++ 中通常不允许通过 union 进行类型双关语。换句话说,ab 没有值。

【讨论】:

...虽然这个技巧并不罕见,并且至少在过去在一个或另一个编译器中似乎有效。我相信它的目的是提供类似swizzling in GLSL 的东西。有时,在 C++ 中禁止类型双关确实很伤人。 ;-) PrintVector(vector4.a); vector4.a 什么都不做,PrintVector() 函数忽略vector4.a 并执行函数的内容? @SeungYup26 未定义行为意味着它没有定义(关于语言标准)PrintVector() 实际上做了什么。充其量,它可能会打印一个 Vector2,其内容为 vector4.xvector4.y。它也可以打印任何东西或只是崩溃。【参考方案2】:

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

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

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

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;

之所以有效,是因为联合的大小是最大成员的最大大小(而不是成员大小的总和)。这意味着成员共享相同的内存,所以如果你写一个,你就可以从另一个读取。

【讨论】:

以上是关于这段代码中变量 a 和 b 的值是多少?的主要内容,如果未能解决你的问题,请参考以下文章

Android开发,java开发程序员常见基础面试题,更换两个变量的值,java逻辑代码

int a=1,b=~a;请问b的值是多少?

求解python中,这段天天向上力量代码中部分语句的解释

关于全部变量和局部变量作用域

基础

JAVA 面试题