以下代码导致:
0.000000
10
在这种情况下,“数据”返回了什么?我知道n.data.idata并且n.data.fdata将是正确的用法,我只是好奇为什么整数值在这种情况下有效而浮点值却不起作用
#include<stdio.h>
#include<stdlib.h>
typedef struct node
{
union container
{
int idata;
float fdata;
} data;
struct node *next;
} Node;
int main()
{
Node i = {.data.idata = 10};
Node n = {.data.fdata = 10.0};
printf("%f\n", n.data);
printf("%d\n", i.data);
printf("\nExiting program...\n");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
让我们暂时忽略明显的未定义行为,这是因为将不正确的类型传递给了specifier的printf函数f。该类型是匿名联合。
说明符f假定默认的参数提升从float到double,在这种情况下不会发生这种情况,因为将联合data传递给了函数。因此,该函数接收data由4个字节组成的并表示一个浮点数的并集,但尝试打印8个字节,因为它期望一个双精度数。结果是一个无意义的值,在您的情况下为0.0。
(此答案假定IEEE 754,并且sizeof(int)<= 4)