I am just learning C and I have a little knowledge of Objective-C due to dabbling in iOS development, however, in Objective-C I was using NSLog(@"%i", x);
to print the variable x to the console however I have been reading a few C tutorials and they are saying to use %d
instead of %i
.
printf("%d", x);
and printf("%i", x);
both print x to the console correctly.
These both seem to get me to the same place so I am asking the experienced developers which is preferred? Is one more semantically correct or is right?
%d seems to be the norm for printing integers, I never figured out why, they behave identically.
I am just adding example here because I think examples make it easier to understand.
In printf() they behave identically so you can use any either %d or %i. But they behave differently in scanf().
For example:
int main()
{
int num,num2;
scanf("%d%i",&num,&num2);// reading num using %d and num2 using %i
printf("%d\t%d",num,num2);
return 0;
}
Output:
You can see the different results for identical inputs.
num
:
We are reading num
using %d
so when we enter 010
it ignores the first 0
and treats it as decimal 10
.
num2
:
We are reading num2
using %i
.
That means it will treat decimals, octals, and hexadecimals differently.
When it give num2
010
it sees the leading 0
and parses it as octal.
When we print it using %d
it prints the decimal equivalent of octal 010
which is 8
.
As others said, they produce identical output on printf, but behave differently on scanf. I would prefer %d
over %i
for this reason. A number that is printed with %d
can be read in with %d
and you will get the same number. That is not always true with %i
, if you ever choose to use zero padding. Because it is common to copy printf format strings into scanf format strings, I would avoid %i
, since it could give you a surprising bug introduction:
I write fprintf("%i ...", ...);
You copy and write fscanf(%i ...", ...);
I decide I want to align columns more nicely and make alphabetization behave the same as sorting: fprintf("%03i ...", ...);
(or %04d
)
Now when you read my numbers, anything between 10 and 99 is interpreted in octal. Oops.
If you want decimal formatting, just say so.
d
and i
conversion specifiers behave the same with fprintf
but behave differently for fscanf
.
As some other wrote in their answer, the idiomatic way to print an int
is using d
conversion specifier.
Regarding i
specifier and fprintf
, C99 Rationale says that:
The %i conversion specifier was added in C89 for programmer convenience to provide symmetry with fscanf’s %i conversion specifier, even though it has exactly the same meaning as the %d conversion specifier when used with fprintf.
both %d
and %i
can be used to print an integer
%d stands for "decimal", and %i for "integer." You can use %x to print in hexadecimal, and %o to print in octal.
You can use %i as a synonym for %d, if you prefer to indicate "integer" instead of "decimal."
On input, using scanf(), you can use use both %i and %d as well. %i means parse it as an integer in any base (octal, hexadecimal, or decimal, as indicated by a 0 or 0x prefix), while %d means parse it as a decimal integer.
check here for more explanation
Source: Stackoverflow.com