Відповіді:
Вони однакові при використанні для виведення, наприклад, з 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.