问题
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 typeint
%f
expects argument of typedouble
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