Причина, по которой 1 не преобразован в 1.0, состоит в том, что printf
является «просто» функцией C с переменным числом аргументов, и только первый (обязательный) аргумент имеет указанный тип (const char *
). Поэтому компилятор «не может» знать, что он должен преобразовывать «лишний» аргумент - он передается до. printf
фактически считывает строку формата и определяет, что он должен получить число с плавающей запятой.
Теперь, правда, ваша строка формата является константой во время компиляции, поэтому компилятор может сделать особый случай из printf
и предупреждают вас о некорректных аргументов (и, как уже упоминалось, некоторые компиляторы это сделать , по крайней мере, если вы попросите их). Но в общем случае он не может знать конкретные форматы, используемые произвольными функциями vararg, а также возможно построить строку формата сложными способами (например, во время выполнения).
В заключение, если вы хотите передать конкретный тип в качестве аргумента «переменная», вам необходимо отправить его.
+1 для дополнительной буквы в «поведении». Us Brits используют его как резервное копирование в случае, если что-то неприятное происходит с «o». –
@ Moo-Juice: Также, чтобы слово имело полный набор доступных гласных. – caf
@caf: Почему я не могу найти y? =) – Arkku