c++ - В чем разница между спецификаторами преобразования% i и% d в форматированных IO-функциях (* printf / * scanf)


В чем разница между %d и %i при использовании в качестве спецификаторов формата в printf ?


Answers


Они одинаковы при использовании для вывода, например, с помощью printf .

Однако они различаются при использовании в качестве спецификатора ввода, например, с помощью scanf , где %d сканирует целое число в виде десятичного числа со знаком, но значение %i умолчанию равно десятичному, но также допускает шестнадцатеричное (если предшествует 0x ) и восьмеричное, если ему предшествует 0 .

Таким образом, 033 будет 27 с %i но 33 с %d .




Они идентичны для 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.



В этих словах нет ни одного слова - эти два являются синонимами.