首页 > 解决方案 > C中的类型转换是香蕉?

问题描述

似乎 C 和我不同意这里的预期输出。

我有:

struct r_struct {
    int r_i;
    float r_f, r_f2;
};

struct r_struct r;

r.f = 100.0;

[...]
printf("f is A:%f B:%d, C:%d, D:%d\n", r.f, r.f, r.f_lhzr / 1, (int)r.f);

我得到这个输出:

f is A:100.000000 B:0, C:1079574528, D:0

我希望得到这个输出,因为浮点数应该以所有三种方式转换为整数:

f is A:100.000000 B:100, C:100, D:100

这里有人可以解释一下吗?

标签: ccastingprintf

解决方案


从规范printf(),例如https://en.cppreference.com/w/cpp/io/c/fprintf

如果默认转换后的任何参数不是相应转换说明符所期望的类型,或者如果参数少于格式所需的参数,则行为未定义

您有浮点值,并且只能将一个转换为int.
您将"%d"说明符用于浮点数,即任何可预测或可解释行为的结束,用于所有输出和任何其他行为,而不仅仅是非强制转换值。

SomeProgrammerDude 在评论中指出了 speficier 和 type 之间的对比。我在这里参考规范添加了 UB 方面。


推荐阅读