That’s because %d expects an int but you’ve provided a float.
Use %e/%f/%g to print the float.
On why 0 is printed: The floating point number is converted to double before sending to printf. The number 1234.5 in double representation in little endian is
00 00 00 00 00 4A 93 40
A %d consumes a 32-bit integer, so a zero is printed. (As a test, you could printf("%d, %d\n", 1234.5f); You could get on output 0, 1083394560.)
As for why the float is converted to double, as the prototype of printf is int printf(const char*, ...), from 6.5.2.2/7,
The ellipsis notation in a function prototype declarator causes argument type conversion to stop after the last declared parameter. The default argument promotions are performed on trailing arguments.
and from 6.5.2.2/6,
If the expression that denotes the called function has a type that does not include a prototype, the integer promotions are performed on each argument, and arguments that have type
floatare promoted todouble. These are called the default argument promotions.
(Thanks Alok for finding this out.)