gpt4 book ai didi

c++ - 联盟中的概念问题

转载 作者:可可西里 更新时间:2023-11-01 17:14:23 25 4
gpt4 key购买 nike

我的代码是这样的

// using_a_union.cpp
#include <stdio.h>

union NumericType
{
int iValue;
long lValue;
double dValue;
};

int main()
{
union NumericType Values = { 10 }; // iValue = 10
printf("%d\n", Values.iValue);
Values.dValue = 3.1416;
printf("%d\n", Values.iValue); // garbage value
}

为什么在执行 Values.dValue = 3.1416 后尝试打印 Values.iValue 时得到垃圾值?我以为内存布局会像 this . Values.iValueValues.lValue; 当我给 Values.dValue 赋值时?

最佳答案

union 中,所有的数据成员都是重叠的。您一次只能使用 union 的一个数据成员。

iValuelValuedValue 都占用相同的空间。

一旦您写入 dValueiValuelValue 成员就不再可用:只有 dValue 可用。


编辑:解决以下评论:您不能写入 union 的一个数据成员,然后从另一个数据成员读取。这样做会导致未定义的行为。 (有一个重要的异常(exception):您可以将 C 和 C++ 中的任何对象重新解释为 char 数组。还有其他一些小异常(exception),例如能够将有符号整数重新解释为无符号整数。)可以在 C 标准 (C99 6.5/6-7) 和 C++ 标准(C++03 3.10,如果我没记错的话)中找到更多信息。

有时这在实践中“有效”吗?是的。但是,除非您的编译器明确声明这种重新解释可以保证正常工作并指定它保证的行为,否则您不能依赖它。

关于c++ - 联盟中的概念问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4201524/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com