problem with printf function?

你。 提交于 2019-12-29 08:11:46

问题


i wrote the following program

 #include <stdio.h>

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

though i know this is the wrong practice,when i run the program i got the answer as

0
4.500000

but when i exchanged the printf statements a little bit this way

#include <stdio.h>

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

the output was

0.000000
0

i couldn't understand whats happening ,any one pls explain me.


回答1:


printf doesn't convert it's arguments. It's looking at the memory containing a float and printing it as if it were an integer - it's like taking an MP3 file and asking word to open it as if it were a doc.

A floating point number is stored in a completely different way in memory to an integer - it's not just an integer with some decimal points




回答2:


Using incorrect format descriptors results in an Undefined Behavior.
Undefined Behavior means the behavior cannot be explained. It might work it might not or give unpredictable results, this behavior can vary anyhow, it cannot be explained in portable conclusive way for all compilers.




回答3:


Basically, the format placeholder is an instruction to the function about how to retrieve and interpret the next chunk of memory from the variable length argument list. It expects the format to be exactly what you tell it. When you retrieve memory in unintended ways, you can cause all sorts of issues and undefined behavior. This is why printf and its ilk are exploitable.




回答4:


an integer and a float have a different internal representation, so you must not mistake the printf %f with %d to avoid unpredictable results. People uses C expecially because C is fast, and it is fast just because it leave all under the programmer responsibility. So don't expect printf do some magic conversion under the hood because it just won't.




回答5:


Basically, format controls replace the placeholder according to specified data type.

  • %d expects argument of type int
  • %f expects argument of type double

So Good way of doing this is

#include <stdio.h>

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


来源:https://stackoverflow.com/questions/7232603/problem-with-printf-function

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!