Відповіді:
Вони однакові при використанні для виведення, наприклад, з printf
.
Однак вони відрізняються, коли вони використовуються як вхідний специфікатор, наприклад, з scanf
, де %d
сканує ціле число у вигляді підписаного десяткового числа, але %i
за замовчуванням на десяткове, але також допускається шістнадцятковий (якщо передує 0x
) та восьмеричний (якщо передує 0
).
Так 033
було б 27, %i
але 33 с %d
.
printf
та scanf
.
Вони однакові для, printf
але різні для scanf
. Для printf
обох %d
і %i
позначте підписане десяткове ціле число. Для scanf
, %d
а %i
також означає підписане ціле число, але %i
вводить вхід як шістнадцяткове число, якщо йому передує, 0x
і восьмеричне, якщо передує 0
і іншим чином інтерпретує введення як десятковий.
Немає різниці між специфікаторами %i
та %d
форматом для printf
. Це ми можемо побачити, перейшовши до проекту стандартного розділу C99 7.19.6.1
Функція fprintf, яка також охоплює printf
специфікатори формату, і в параграфі 8 йдеться про :
Специфікаторами перетворення та їх значеннями є:
і включає в себе наступну кулю:
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.
З іншого боку, для scanf
цього є різниця, %d
припустимо, що база 10 при %i
автоматичному виявленні бази. Це ми можемо побачити, перейшовши до розділу 7.19.6.2
Функція fscanf, яка охоплює scanf
специфікатор формату, у пункті 12 написано:
Специфікаторами перетворення та їх значеннями є:
і включає наступне:
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.