2

我有以下代码:

double dtemp = (some value)
printf("\n***Hand washing: cost per kg/item: %.2f, cost: %.2f.\n", 5, dtemp);

它打印出来:

***手洗:每公斤/件的成本:0.00,成本:0.00。

当我将常量 5 更改为持有 5 的双变量时,它会打印(根据输入):

***手洗:每公斤/件的成本:5.00,成本:20.00。

为什么常数 5 会影响 dtemp 的评估?我正在使用 gcc 4.6.2 (MinGW) 并在 TCC 中对其进行了测试。

4

3 回答 3

8

f转换说明符double在与printf函数一起使用时需要 a 并且您正在传递int. 传递 anint是未定义的行为,这意味着任何事情都可能发生。

于 2012-07-08T11:17:06.247 回答
7

我的编译器 (gcc 4.4.3) 警告消息解释了这一点:

   format ‘%.2f’ expects type ‘double’, but argument 2 has type ‘int’

由于您传递的值类型int( ) 与格式字符串中指定的 ( ) 类型不同double,因此由于这种不匹配,行为未定义

正如您所观察到的,一旦您将其调整为一致,您就会得到您期望的输出。IE,

/* provide a double value */
printf("\n***Hand washing: cost per kg/item: %.2f, cost: %.2f.\n", 5.0, dtemp);

输出:

***Hand washing: cost per kg/item: 5.00, cost: 3.14.

或者

/* specify an integer value in the format string */
printf("\n***Hand washing: cost per kg/item: %d, cost: %.2f.\n", 5, dtemp);

输出:

***Hand washing: cost per kg/item: 5, cost: 3.14.

提高编译器上的警告级别,然后跟进所有警告,并慎重决定哪些可以忽略,哪些不能忽略,这始终是一个好主意。

于 2012-07-08T11:18:11.180 回答
0

e printf函数第一个参数是字符串,每隔%d检查一次,然后移动点,例如:%d,move 4 len;%lld 移动 8. int64_t a = 1;int b = 2; printf("%d, %d\n", a, b); 答案是 1,0。因为这两个 %d 只是得到较低的 4 字节和高 4 字节。

printf("\n***洗手:每公斤/件的成本:%.2f,成本:%.2f.\n", 5, dtemp); sizeof(doubel) = 8 ,所以 printf 函数只得到 0x0000000000000005。

我希望它会帮助你。

于 2012-07-08T11:41:44.827 回答