2

对于我希望产生相同输出的两个程序,我看到了不同的结果,第一种情况:

int money;

printf("Enter the price of the car: ");
scanf("%d", &money);

printf("\nResult: %d .\n", money+money*0.4);

第二种情况:

int money;

printf("Enter the price of the car: ");
scanf("%d", &money);

money=money+money*0.4;

printf("\nResult: %d .\n", money );
return 0;

在第一种情况下,结果printf0但不是在第二种情况下。为什么我会看到这些不同的结果?

4

3 回答 3

7

%d格式说明符告诉您printf传入的是int,但在第一种情况下,您传入的是double,这也是未定义的行为,因此结果不可靠。的结果:

money+money*0.4

双精度的,因为一个浮点常量精度的,除非它有一个后缀,并且乘法加法f的结果也是双精度的,因为这两个运算都受到通常的算术转换,这将导致的值被转换为双倍的操作。money

在第二种情况下,您正确传递了int并且因为您将结果分配给money

money=money+money*0.4

它将截断双精度值。我不确定您使用的是什么编译器,但无论是否clanggcc任何警告标志都警告格式说明符不正确,gcc例如:

警告:格式“%d”需要“int”类型的参数,但参数 2 的类型为“double”[-Wformat]

因此,如果您没有看到该行的任何警告,您应该考虑将警告级别设置得更高。

为了完整起见,草案 C99 标准部分7.19.6.1 The fprintf function也涵盖printf了格式说明符,在第9段中说:

如果转换规范无效,则行为未定义。248)如果任何参数不是相应转换规范的正确类型,则行为未定义。

于 2013-10-28T11:46:46.977 回答
3

检查第 7 行中的乘法。

您可以将最后几行更改为:

float price = money * 1.4;
printf( "\nResult %f.\n", price);
于 2013-10-28T11:49:04.790 回答
1

money+money*0.4将隐式money转换为 double 并因此%d为该值生成错误的格式说明符。

于 2013-10-28T11:46:35.463 回答