简体   繁体   中英

%i or %d to print integer in C using printf()?

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 ?

They are completely equivalent when used with printf() . Personally, I prefer %d , it's used more often (should I say "it's the idiomatic conversion specifier for int "?).

(One difference between %i and %d is that when used with scanf() , then %d always expects a decimal integer, whereas %i recognizes the 0 and 0x prefixes as octal and hexadecimal, but no sane programmer uses scanf() anyway so this should not be a concern.)

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 .

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.

%d 似乎是打印整数的规范,我一直不知道为什么,它们的行为相同。

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

why does %d stand for Integer?

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.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM