Odpowiedzi:
Są takie same, gdy są używane jako dane wyjściowe, np printf
. Z.
Jednak różnią się one, gdy są używane jako specyfikator wejściowy, np. Z scanf
, gdzie %d
skanuje liczbę całkowitą jako liczbę dziesiętną ze znakiem, ale %i
domyślnie jest to liczba dziesiętna, ale pozwala także na wartości szesnastkowe (jeśli poprzedza je 0x
) i ósemkowe (jeśli poprzedza je 0
).
Tak 033
byłoby 27 z, %i
ale 33 z %d
.
printf
i scanf
.
Są identyczne, printf
ale różne dla scanf
. Dla printf
zarówno %d
i %i
wyznacza liczbę całkowitą ze znakiem dziesiętnym. For scanf
, %d
a %i
także oznacza liczbę całkowitą ze znakiem, ale interpretuje dane wejściowe jako %i
liczbę szesnastkową, jeśli jest poprzedzone przez, 0x
i ósemkowe, jeśli jest poprzedzone, 0
i inaczej interpretuje dane wejściowe jako dziesiętne.
Nie ma różnicy między specyfikatorami %i
i dla %d
formatu printf
. Widzimy to, przechodząc do projektu standardowej sekcji C99. 7.19.6.1
Funkcja fprintf, która obejmuje również printf
specyfikatory formatu i mówi w paragrafie 8 :
Specyfikatory konwersji i ich znaczenie to:
i zawiera następujący punkt:
d,i The int argument is converted to signed decimal in the style [−]dddd. The precision specifies the minimum number of digits to appear; if the value being converted can be represented in fewer digits, it is expanded with leading zeros. The default precision is 1. The result of converting a zero value with a precision of zero is no characters.
Z drugiej strony, ponieważ scanf
istnieje różnica, %d
załóż bazę 10, podczas gdy %i
auto wykrywa bazę. Możemy to zobaczyć przechodząc do sekcji 7.19.6.2
Funkcja fscanf, która obejmuje scanf
w odniesieniu do specyfikatora formatu, w paragrafie 12 mówi:
Specyfikatory konwersji i ich znaczenie to:
i obejmuje:
d Matches an optionally signed decimal integer, whose format is the same as expected for the subject sequence of the strtol function with the value 10 for the base argument. The corresponding argument shall be a pointer to signed integer. i Matches an optionally signed integer, whose format is the same as expected for the subject sequence of the strtol function with the value 0 for the base argument. The corresponding argument shall be a pointer to signed integer.