% я или% d для печати целого числа в c с помощью printf()?
Я просто изучаю C, и у меня мало знаний о Objective-C из-за работы в iOS-разработке, однако в Objective-C я использовал NSLog(@"%i", x);
для печати переменной x на консоли, но я читал несколько учебников по C, и они говорят использовать %d
вместо %i
.
printf("%d", x);
и printf("%i", x);
как правильно напечатать x на консоли.
Кажется, они оба попадают в одно и то же место, поэтому я прошу опытных разработчиков, которые предпочитают? Является ли еще семантически правильным или правильным?
Ответы
Ответ 1
Они полностью эквивалентны при использовании с printf()
. Лично я предпочитаю %d
, он использовал чаще (должен ли я сказать "это спецификатор преобразования idiomatic для int
"?).
(Одно отличие между %i
и %d
заключается в том, что при использовании с scanf()
, тогда %d
всегда ожидает десятичное целое число, тогда как %i
распознает префиксы 0
и 0x
как восьмеричные и шестнадцатеричный, но ни один здравомыслящий программист не использует scanf()
, так что это не должно вызывать беспокойства.)
Ответ 2
Я просто добавляю пример, потому что, на мой взгляд, примеры облегчают понимание.
В printf() они ведут себя одинаково, поэтому вы можете использовать любой либо% d, либо% i. Но они работают по-разному в scanf().
Например:
int main()
{
int num,num2;
scanf("%d%i",&num,&num2);// reading num using %d and num2 using %i
printf("%d\t%d",num,num2);
return 0;
}
Вывод:
![enter image description here]()
Вы можете увидеть разные результаты для идентичных входов.
num
Мы читаем num
, используя %d
, поэтому, когда мы вводим 010
, он игнорирует первый 0
и рассматривает его как десятичный 10
.
num2
Мы читаем num2
с помощью %i
.
Это означает, что он будет обрабатывать десятичные знаки, восьмеричные и шестнадцатеричные по-разному.
Когда он дает num2
010
, он видит ведущую 0
и анализирует ее как восьмеричную.
Когда мы печатаем его с помощью %d
, он печатает десятичный эквивалент восьмеричного 010
, который является 8
.
Ответ 3
d
и i
спецификаторы преобразования ведут себя одинаково с fprintf
, но ведут себя по-разному для fscanf
.
Как писал другой пользователь в своем ответе, идиоматический способ печати int
использует d
спецификатор преобразования.
Что касается спецификатора i
и fprintf
, C99 Обоснование говорит, что:
Спецификатор преобразования% я был добавлен в C89 для удобства программиста для обеспечения симметрия с спецификатором преобразования fscanfs% i, хотя он имеет точно такое же значение как спецификатор преобразования% d при использовании с fprintf.
Ответ 4
% d кажется нормой для печати целых чисел, я никогда не выяснял, почему они ведут себя одинаково.
Ответ 5
оба %d
и %i
могут использоваться для печати целого числа
% d означает "десятичный", а% я - "целое число". Вы можете использовать% x для печати в шестнадцатеричном формате и% o для печати в восьмеричном формате.
Вы можете использовать% я в качестве синонима для% d, если вы предпочитаете указывать "integer" вместо "decimal".
На входе, используя scanf(), вы можете использовать как% i, так и% d. % я означает разбор его как целое в любой базе (восьмеричный, шестнадцатеричный или десятичный, как указано префикс 0 или 0x), а% d означает синтаксический анализ его как десятичного целого.
проверьте здесь, чтобы узнать больше.
почему% d обозначает Integer?
Ответ 6
Как говорили другие, они производят идентичный вывод на printf, но ведут себя по-разному на scanf. По этой причине я предпочитаю %d
более %i
. Число, напечатанное с помощью %d
, можно прочитать с помощью %d
, и вы получите тот же номер. Это не всегда верно с %i
, если вы когда-нибудь захотите использовать нулевое дополнение. Поскольку для копирования строк формата printf в строки scanf часто используется, я бы избегал %i
, так как это могло бы дать вам неожиданное введение ошибки:
Пишу fprintf("%i ...", ...);
Вы копируете и пишете fscanf(%i ...", ...);
Я решил, что хочу выравнивать столбцы более красиво и вести алфавитность так же, как и сортировка: fprintf("%03i ...", ...);
(или %04d
)
Теперь, когда вы читаете мои цифры, что-то между 10 и 99 интерпретируется в восьмеричном. К сожалению.
Если вы хотите десятичное форматирование, просто скажите это.