首页 > 解决方案 > 我应该使用哪个占位符,为什么?

问题描述

为什么代码仅在我使用 %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));

标签: cprintfdoubleimplicit-conversionconversion-specifier

解决方案


的类型(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出于实际原因是等效的。


推荐阅读