【发布时间】:2019-03-09 00:09:43
【问题描述】:
我读到这段代码根据 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;
}
【问题讨论】:
-
@tadman 这不是未定义的行为。从 C99 开始特别允许,并在 C11 中添加了一个脚注,阐明了它的合法性。
-
@ChristianGibbons 如果您有引用会有所帮助。我看不出你怎么能在这里定义
i会发生什么。 -
@tadman 查看一些程序员老兄的回答。他比我快。
-
@ChristianGibbons 感谢您的来信。拉了我的答案。
-
根据 6.2.6.1/5 的措辞和脚注 95,它是未定义的除非其中一个成员是字符类型,我将其解释为单个字符或数组。在
char或unsigned char中没有陷阱表示,因此您应该能够安全地写入T类型的成员并从char或char [N]类型的成员中读取。对于任何其他类型,所有赌注都已取消。
标签: c language-lawyer