c - 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
这里有人可以解释一下吗?
解决方案
从规范printf()
,例如https://en.cppreference.com/w/cpp/io/c/fprintf
如果默认转换后的任何参数不是相应转换说明符所期望的类型,或者如果参数少于格式所需的参数,则行为未定义。
您有浮点值,并且只能将一个转换为int
.
您将"%d"
说明符用于浮点数,即任何可预测或可解释行为的结束,用于所有输出和任何其他行为,而不仅仅是非强制转换值。
(SomeProgrammerDude 在评论中指出了 speficier 和 type 之间的对比。我在这里参考规范添加了 UB 方面。)
推荐阅读
- asp.net - 使用 ReportViewer Asp.net 时无法加载视图状态
- c# - EmguCV (OpenCV) ORBDetector 只发现错误的匹配项
- php - 为什么我在使用 PHP 生成的 XML 文件中出现错误
- sql-server - 当辅助表在左连接中返回空值时从主表获取记录
- python - 如何在峰值上绘制索引号值的时间序列?
- css - Visual Studio 的 SCSS 编译器扩展
- java - 在主布局顶部自动弹出一个对话框
- java - java jvm 11 无法启动
- android - 为旧版操作系统设置通用按钮样式
- ionic-framework - 由于 es6 代码未转译 android 5.1.1,模拟器和设备上出现白屏