В чем разница между %d
и %i
при использовании в качестве спецификаторов формата в printf
?
В чем разница между спецификаторами преобразования% я и% d в форматированных IO-функциях (* printf/* scanf)
Ответ 1
Они одинаковы при использовании для вывода, например с printf
.
Тем не менее, они отличаются при использовании в качестве спецификатора ввода, например с scanf
, где %d
сканирует целое число как десятичное число со знаком, но %i
по умолчанию принимает десятичное значение, но также допускает шестнадцатеричное (если ему предшествует 0x
) и восьмеричное (если ему предшествует 0
).
Таким образом, 033
будет 27 с %i
, но 33 с %d
.
Ответ 2
Они идентичны для printf
, но отличаются для scanf
. Для printf
оба %d
и %i
обозначают знаковое десятичное целое число. Для scanf
, %d
и %i
также означает целое число со знаком, но %i
вводит ввод как шестнадцатеричное число, если ему предшествует 0x
и восьмеричный, если ему предшествует 0
, и в противном случае интерпретирует ввод как десятичный.
Ответ 3
Нет разницы между спецификаторами формата %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.
Ответ 4
В printf
их нет - это синонимы.