Подтвердить что ты не робот

% я или% d для печати целого числа в c с помощью printf()?

Я просто изучаю C, и у меня мало знаний о Objective-C из-за работы в iOS-разработке, однако в Objective-C я использовал NSLog(@"%i", x); для печати переменной x на консоли, но я читал несколько учебников по C, и они говорят использовать %d вместо %i.

printf("%d", x); и printf("%i", x); как правильно напечатать x на консоли.

Кажется, они оба попадают в одно и то же место, поэтому я прошу опытных разработчиков, которые предпочитают? Является ли еще семантически правильным или правильным?

4b9b3361

Ответ 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 интерпретируется в восьмеричном. К сожалению.

Если вы хотите десятичное форматирование, просто скажите это.