Ответы:
Они одинаковы при использовании для вывода, например, с printf
.
Однако они отличаются, когда используются в качестве входного спецификатора, например, с scanf
, где %d
сканирует целое число как десятичное число со знаком, но по %i
умолчанию используется десятичное число, но также допускается шестнадцатеричное (если ему предшествует 0x
) и восьмеричное (если ему предшествует 0
).
Так 033
было бы 27 с %i
но 33 с %d
.
printf
и scanf
.
Они идентичны для, printf
но разные для scanf
. Ибо printf
, %d
и %i
назначьте десятичное целое число со знаком. For 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.