0

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

4

2 回答 2

3

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

于 2021-10-25T17:32:46.537 回答
2

这个表达

(Hourly * HoursAday * daysAweek) * (Fired - Hired)

double由于通常的算术转换而具有类型,因为变量具有Hourly类型double。也就是说,如果double在二元运算中一个操作数具有 type 而另一个操作数具有 integer 类型,则具有 integer 类型的操作数将转换为 type double

%d使用设计用于输出该类型对象的错误转换说明符与该类型int的对象会double调用未定义的行为。

请注意,在此转换说明符%lf中,长度修饰符l无效。所以用起来就够了%f

于 2021-10-25T17:34:01.797 回答