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

Как printf и co различают float и double

Поскольку он не сильно типизирован, я думал, что он просто выбрал правильный размер памяти и интерпретировал его на основе типа аргумента. Но float и double используют% f, и они имеют разные размеры.

P.S. Я могу видеть, как продвижение по копированию значения в temp и casting (это правильно?) Может работать но как это работает для scanfs/sscanf?

4b9b3361

Ответ 1

Он не дифференцируется. Невозможно получить float как vararg: любой аргумент float, который вы предоставляете, сначала рекламируется до double.

6.5.2.2/6 определяет "поощрения по умолчанию для аргументов по умолчанию" и /7 указывает, что промо-объявления по умолчанию применяются к "конечным аргументам", то есть varargs, обозначенным как ....

как это работает для scanfs/sscanf?

Для формата %f для scanf требуется указатель на float. %lf требуется указатель на double, %lf требуется указатель на long double.

копирование значения в temp и casting (это правильно?)

Если вы предоставляете аргумент float, тогда реализация создает временный тип double, инициализирует его значением float и передает это как vararg. Кастинг по определению - это явное преобразование с помощью оператора трансляции - вы можете использовать, если хотите, чтобы он четко дал понять читателю, что происходит, но float f = 3; printf("%f", f); точно совпадает с float f = 3; printf("%f", (double)f);. Продвижение аргументов по умолчанию имеет то же значение, что и приведение.