Причина, по которой 1 не преобразуется в 1.0, заключается в том, что printf
является «просто» функцией C с переменным числом аргументов, и только первый (обязательный) аргумент имеет указанный тип (const char *
). Поэтому компилятор «не может» знать, что он должен преобразовывать «дополнительный» аргумент - он передается до того, как printf
фактически прочитает строку формата и определит, что он должен получить число с плавающей запятой.
Теперь, по общему признанию, ваша строка формата является константой времени компиляции, и поэтому компилятор может сделать особый случай из printf
и предупредить о неправильных аргументах ( как уже упоминали другие, некоторые компиляторы делают это, по крайней мере, если вы об этом попросите). Но в общем случае он не может знать конкретные форматы, используемые произвольными функциями vararg, и также возможно сложное форматирование строки формата (например, во время выполнения).
В заключение, если вы хотите передать определенный тип в качестве аргумента «переменная», вам необходимо привести его.