printf函数的问题?

时间:2011-08-29 16:00:49

标签: c casting printf

我写了以下程序

 #include <stdio.h>

 main()
 {
 int i = 2;
 float c = 4.5;
 printf("%d\n",c);
 printf("%f\n",i);
 return 0;
 }

虽然我知道这是错误的做法,但当我运行该程序时,我得到了答案

0
4.500000

但是当我以这种方式交换printf语句时

#include <stdio.h>

main()
{
int i = 2;
float c = 4.5;
printf("%f\n",i);
printf("%d\n",c);
return 0;
}

输出

0.000000
0

我无法理解发生了什么,任何人都会解释我。

5 个答案:

答案 0 :(得分:7)

printf不会转换它的参数。它正在查看包含浮点数的内存并将其打印为好像它是一个整数 - 就像拿一个MP3文件并要求单词打开它一样,就好像它是一个doc。

浮点数在内存中以完全不同的方式存储到整数 - 它不仅仅是一个带小数点的整数

答案 1 :(得分:6)

使用不正确的格式描述符会导致未定义的行为 未定义的行为意味着无法解释行为。它可能无法工作或给出不可预测的结果,这种行为无论如何都会有所不同,它无法以便携式结论的方式解释所有编译器。

答案 2 :(得分:2)

整数和浮点数具有不同的内部表示,因此您不能将printf %f误认为%d以避免不可预测的结果。人们使用C尤其是因为C很快,而且速度很快只是因为它让所有人都受到程序员的责任。所以不要指望printf在引擎盖下进行一些神奇的转换,因为它不会。

答案 3 :(得分:2)

基本上,格式占位符是关于如何从可变长度参数列表中检索和解释下一块内存的函数的指令。它希望格式完全符合您的要求。以非预期的方式检索内存时,可能会导致各种问题和未定义的行为。这就是printf及其同类产品可以利用的原因。

答案 4 :(得分:0)

基本上,格式控件根据指定的数据类型替换占位符。

  • %d需要int
  • 类型的参数
  • %f需要double
  • 类型的参数

这样做的好方法是

#include <stdio.h>

int main(){
   int i = 2;
   float c = 4.5;
   printf("%d\n",i);
   printf("%f\n",c);
   return 0;
}