printf参数相互影响

时间:2012-07-08 11:15:43

标签: c double printf

我有以下代码:

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中测试它。

3 个答案:

答案 0 :(得分:8)

f函数一起使用时,

double转换说明符需要printf,并且您传递int。传递int是未定义的行为,这意味着任何事情都可能发生。

答案 1 :(得分:7)

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

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

由于您在格式字符串中传递的值与{(1}})不同,但由于此不匹配,行为未定义

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

int

输出:

double

/* 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.

总是一个好主意,在编译器上提高警告级别,然后跟进所有警告,并对可忽略的内容和不可忽略的内容做出深思熟虑的决定。

答案 2 :(得分:0)

e printf函数第一个参数是字符串,它检查每个%d,然后移动该点,例如:%d,移动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。

我希望它会对你有所帮助。