c - 我应该使用哪个占位符,为什么?
问题描述
为什么代码仅在我使用 %lf 或 %f 占位符(第二个占位符)时有效,但在我使用 %d 时它打印 0?
#include <stdio.h>
void main()
{
long id;
id = 123456789;
double Hourly;
Hourly = 30;
int HoursAday, daysAweek, Fired, Hired;
HoursAday = 8; daysAweek = 5; Fired = 2021; Hired = 2019;
printf("bob, id: \"%d\" should get %lf", id, (Hourly * HoursAday * daysAweek) * (Fired - Hired));
解决方案
的类型(Hourly * HoursAday * daysAweek) * (Fired - Hired)
是double
所以正确的说明符是%lf
。由于可变参数默认转换,代码也可以使用%f
(*)。但是%d
是未定义的行为。
id
此外, (类型为)的正确说明符long
是%ld
. %d
是未定义的行为。
请参阅 printf 的文档:https ://en.cppreference.com/w/c/io/fprintf
(*)float
可变参数总是被转换为double
. 所以printf
函数族永远不会收到 a float
,他们总是会收到 a double
。这就是为什么%f
并且%lf
出于实际原因是等效的。
推荐阅读
- macos - 温文尔雅的“Hello World!” 程序不适用于 Visual Studio for Mac
- python - pandas 独特的价值观如何以迭代为起点
- keras - 运行 CNN 时出现不支持的操作数类型错误
- macos - 如何使用苹果脚本将消息标记为已读?
- java - AsyncTask 完成,但 Activity UI 超过 20 秒未更新
- python - 如何使用代理艺术家为 Matplotlib 中的轮廓图创建图例
- batch-file - 批处理 - 如果音频文件没有播放,它是否被认为是一项任务?
- spring - Spring LDAP 和 Spring Cloud Consul 可以一起工作吗?
- java - 使用 JPA 和 Hibernate 时如何避免超类查询中的多态性
- java - 使用 setcap 功能运行时 JLI_InitArgProcessing 的 Java“符号查找错误”