繁体   English   中英

printf函数的问题?

[英]problem with printf function?

我写了以下程序

 #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

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

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

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

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

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

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

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

  • %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;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM