一次只能操纵一个工会成员是什么意思?

what does it mean by saying that union members can only be manipulted one at a time?

我刚刚在阅读联合和堆栈背后的理论。这本书(E Balagurusamy 的 C++ 面向对象编程)说 "members of a union can only be manipulated one at a time"。但我在和工会混在一起。我没有出错。

#include <iostream>
#include <iomanip>
#include "ConsoleApplication1.h"

using namespace std;
//user defined data types
#define writeln(x)(cout<<x<<endl)
union result
{
    int marks;
    char grade;
    float percent;
};
int main()
{  
    result result;
    result.marks = 90;
    result.grade = 'a';
    writeln(result.grade);
    writeln(result.marks);
}

请您澄清一下该声明的含义。谢谢:).

union中,每个变量共享相同的内存。出于这个原因,你得到输出 'a' 和 '97'.

result result;
result.marks = 90; // memory value is 90
result.grade = 'a'; // memory value is 97 ('a')
writeln(result.grade); // print 97 ('a')
writeln(result.marks); // print 97

这意味着你正在调用未定义的行为。让我们看看每一行代码发生了什么:

result result;         // ok, you have declared an union
result.marks = 90;     // ok, result.marks is defined
result.grade = 'a';    // ok, result.grade is defined, but result.mark is no longer
writeln(result.grade); // ok, access to the last written member of the union
writeln(result.marks); // UB: access to a member which is not the last writter

UB对新人来说真的很不友好,因为什么事都有可能发生:

  • 编译器可以检测到问题并发出警告或错误(但不需要...)
  • writeln(result.marks) 可以写 90'a' 字符的代码 (97) 或什么都不写,或者甚至结束程序的其他东西

由于任何事情都有可能发生,您可以在一个 运行 上获得预期的行为,然后再获得一个不同的行为。

长话短说:不要玩那个...

  • 结果结果;

  • result.marks = 90;

    // 从 &result 开始写入 4 个字节(内存:5a 00 00 00 - 90) 注意: 内存使用机制 big endian or little endian 90 是 00 00 00 5a,big endian 内存将是 5a 00 00 00 而 little endian 将相反

  • result.grade = 'a';

    // 从 &result 开始写入 1 个字节(内存:61 - 'a')

  • writeln(result.grade); // 从 &result

    开始获取 1 个字节
  • writeln(result.marks); // 从 &result

    开始获取 4 字节