gpt4 book ai didi

c - union 中的 printf 值取决于格式

转载 作者:太空宇宙 更新时间:2023-11-04 01:30:38 25 4
gpt4 key购买 nike

可以根据格式说明符扫描值到 union 中。

union {
int i;
double f;
} u;

scanf("%lf", &u.i); // implicitly scan the double

printf("%lf", u.f); // explicitly print the double

这是有效的,因为 scanf以指针为参数, union 中的所有元素对齐,(void*)&u.i == (void*)&u.f

是否可以更改 printf以一种做同样事情的方式行,根据格式从 union 中选择正确的值来打印,而不会意外地切割一些可能的值?

printf("%lf", ???); // implicitly print the double

最佳答案

printf 无法推断传递给它的参数的类型。该参数将根据格式字符串中相应的转换说明符进行解释。因此,参数必须正确对应于它们各自的转换说明符。引用 C11 标准 § 7.21.6.1 ¶9 关于 fprintf

If a conversion specification is invalid, the behavior is undefined. If any argument is not the correct type for the corresponding conversion specification, the behavior is undefined.

再次引用 C11 标准 § 7.21.6.2 ¶13 关于 fscanf

If a conversion specification is invalid, the behavior is undefined.

因此,以下对 scanf 的调用会调用未定义的行为,因为 u.i 的类型为 int%lf转换说明符表示您正在读取 double

scanf("%lf", &u.i);

请阅读这些-

  1. What happens when I use the wrong format specifier?
  2. Wrong format specifiers in scanf or printf

此外,访问不是最近写入的 union 字段是未定义的行为。

union {
int i;
double f;
} u;

// undefined behaviour. u.i is of type int but %lf
// means scanf will read a double
scanf("%lf", &u.i);

// undefined behaviour because reading the field u.f
// but the last written field is u.i
printf("%lf", u.f);

关于c - union 中的 printf 值取决于格式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23103841/

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