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

后端 未结 6 980
春和景丽
春和景丽 2020-12-08 02:08

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

相关标签:
6条回答
  • 2020-12-08 02:46

    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.

    0 讨论(0)
  • 2020-12-08 02:49

    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.)

    0 讨论(0)
  • 2020-12-08 02:55

    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:

    enter image description here

    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.

    0 讨论(0)
  • 2020-12-08 02:57

    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?

    0 讨论(0)
  • 2020-12-08 02:59

    %d seems to be the norm for printing integers, I never figured out why, they behave identically.

    0 讨论(0)
  • 2020-12-08 03:06

    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.

    0 讨论(0)
提交回复
热议问题