一次只能操纵一个工会成员是什么意思?
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 字节
我刚刚在阅读联合和堆栈背后的理论。这本书(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 字节