我读到这段代码根据 c 标准是未定义的,但我找不到原因。
它在 gcc 8.1.0 和 clang-6.0 中编译没有错误并打印 1。
代码如下:
#include <stdio.h>
int main()
{
union {
int i;
short s;
} u;
u.i = 42;
u.s = 1;
printf("%d\n", u.i);
return 0;
}
根据 C11 规范,§6.5.2.3 注释 95:
如果用于读取联合对象内容的成员与上次用于读取内容的成员不同
在对象中存储一个值,该值的对象表示的适当部分被重新解释
作为新类型中的对象表示,如 6.2.6 中所述(这个过程有时称为“type
双关语”)。这可能是一个陷阱表示。
这表示您正在做的事情是允许的,但也意味着您读取的值可能不是您所期望的(例如通过写入int
会员并阅读float
成员)。
还有关于陷阱表示值的警告,在这种情况下,行为将是未定义的。为了二进制补码 https://en.wikipedia.org/wiki/Two's_complement不过,对于整数系统(这是过去几十年所有计算机中的绝大多数)来说,这不是整数值的问题。
在你的情况下,结果很大程度上取决于平台字节顺序 https://en.wikipedia.org/wiki/Endianness。要么你会得到你写的值(1
)或者你会得到0
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)