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

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

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

由于您在格式字符串中传递的值( 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. 

要么

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

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

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

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

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