raghu
raghu

Reputation: 441

problem with printf function?

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

Answers (5)

Shushant
Shushant

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

Martin Beckett
Martin Beckett

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

Alok Save
Alok Save

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

Felice Pollano
Felice Pollano

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

Poodlehat
Poodlehat

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

Related Questions