下面的代码输出是()
int main() { union Data { struct { int x; int y; } s; int x; int y; } d; d.x = 1; d.y = 2; d.s.x = d.x * d.x; d.s.y = d.y + d.y; printf("%d %d\n", d.s.x, d.s.y); return 0; }
union(联合):一个union可以有多个数据成员,但是在任意时刻只有一个数据成员可以有值。当我们给union的某个成员赋值后,该union的其他成员就变成未定义的状态了。一个union的大小取决于它的最大的数据成员,所有的成员共享一块内存空间
union Test { int i; char c; }; int main() { Test t; t.i = 65; cout << t.c; return 0; } /* 输出: A */
A的ASCII值为65,我们先为union中的int值赋值65,然后使用char来访问这块内存中的数据,结果输出A。即它们共享相同的存储空间
现在我们假设这个union在内存中的开始地址为0:
地址 | int x | int y | struct s |
---|---|---|---|
8 | |||
4 | y | ||
0 | x | y | x |
过程:
d.x = 1
:结果d.x
、d.y
和d.s.x
都为1
d.y = 2
:结果d.x
、d.y
和d.s.x
都为2
d.s.x = d.x * d.x
:结果d.x
、d.y
和d.s.x
都为4
d.s.y = d.y + d.y
:结果d.s.y
为8
int main() { union Data { struct { int x; int y; } s; int x; int y; } d; d.x = 1; // x = 1, y = 1, s.x = 1. s.y = 未初始化随机值 printf("%d %d %d %d\n", d.x, d.y, d.s.x, d.s.y); d.y = 2; // x = 2, y = 2, s.x = 2. s.y = 未初始化随机值 printf("%d %d %d %d\n", d.x, d.y, d.s.x, d.s.y); d.s.x = d.x * d.x; // x = 4, y = 4, s.x = 4. s.y = 未初始化随机值 printf("%d %d %d %d\n", d.x, d.y, d.s.x, d.s.y); d.s.y = d.y + d.y; // x = 4, y = 4, s.x = 4. s.y = 8 // 因为s.y在s.x后面,所以修改它不会影响到前面的三个值 printf("%d %d %d %d\n", d.x, d.y, d.s.x, d.s.y); return 0; }