2012-01-21 1 views
5

В C у вас есть "%c" и "%f" форматы флагов для printf - и scanf-подобные функции. Обе эти функции используют аргументы переменной длины ..., которые всегда конвертируют floats в doubles и chars в ints.Почему ``% c "` существует в `printf`, если` char` преобразуется в `int`?

Мой вопрос, если это изменение происходит, почему существуют отдельные флаги для char и float? Почему бы просто не использовать те же флаги, что и для int и double?

Связанные вопрос:
Why does scanf() need "%lf" for doubles, when printf() is okay with just "%f"?

ответ

8

Так как она получает распечатаны отличается.

printf("%d \n",100); //prints 100 
printf("%c \n",100); //prints d - the ascii character represented by 100 
+0

Oh .. очевидно. Как насчет 'float'? –

+3

@PaulManta: флаг форматирования '% f' ожидает аргумент' double'. –

0

Поскольку float и double имеют разные представления машины и размеры, а также соглашения о вызовах: многие процессоры имеют регистры, посвященные плавающую точку, которая может быть использована для передачи аргументов.

И стандарт C требует, чтобы short аргументы преобразуются в int и float аргументы преобразуются в double.

+1

Обратите внимание, что эти преобразования не выполняются для всех аргументов, только для аргументов, в которых объявление функции не указывает тип параметра. –

+0

@Keith: что имеет отношение к этому вопросу, так это то, что акции всегда применяются к varargs. Как вы говорите, это подмножество «аргументов, в которых объявление функции не указывает тип параметра». –