Reputation: 441
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.
Upvotes: 2
Views: 3491
Reputation: 1635
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;
}
Upvotes: 0
Reputation: 96187
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
Upvotes: 7
Reputation: 206646
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.
Upvotes: 6
Reputation: 33272
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.
Upvotes: 2
Reputation: 360
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.
Upvotes: 2