модификатор длины ' l ' не влияет на следующий спецификатор преобразования a, A, e, E, f, F, g или G


Я пытаюсь понять следующий раздел :

l (ell)

Указывает, что следующее d, i, o, u, x, или X преобразование спецификатор применяется к аргументу long или unsigned long; что A следующий спецификатор преобразования n применяется к указателю на long аргумент; что следующий спецификатор преобразования c применяется к wint_t аргумент; что следующий спецификатор преобразования s применяется к указателю к wchar_t аргумент; или не оказывает никакого влияния на следующее a, A, e, E, f, F, g, или спецификатор преобразования G.

Я также вижу, что это согласуется с cppreference:fprintf, где "%f" и "%lf" эквивалентны для семейства printf().

Так является лиэтот ответ ошибочным ? Или теперь C99 ясно дает понять, что "%f" - это для float, а "%lf" - для double для printf() семейных функций ?

2 2

2 ответа:

TL; DR - ответ, который вы связали, совершенно прекрасен. %f в printf() может обрабатывать double и float, оба типа аргумента.


Информация: printf() является вариадической функцией .

Согласно C99, Глава 7.19.6.3

Синтаксис

#include <stdio.h>
int printf(const char * restrict format, ...);

И относительно спецификатора формата %f,

f,F

Аргумент double, представляющий число с плавающей запятой, является преобразовано в десятичная запись в стиле [ - ] ddd.ddd , где число цифр после знак десятичной запятой равен спецификации точности. [....]

Итак, мы видим, что стандарт упоминает только double. Любопытно узнать о его более молодом аналоге, float?

Затем из главы §6.5.2.2, пункт 7

[...] Запись многоточия в деклараторе прототипа функции вызывает преобразование типов аргументов, чтобы остановить после последнего объявленного параметра. Аргумент по умолчанию промоакции выполняются по конечным аргументам.

И, что касается аргумента по умолчанию часть, (Курсив мой ), пункт 6,

[...] Если выражение, обозначающее вызываемую функцию, имеет тип, который не включает в себя прототип, целочисленные продвижения выполняются для каждого аргумента, и аргументов, которые имеют тип float повышены до double. Это вызывается аргумент по умолчанию специальные акции. [...]

Таким образом, для функции printf() со спецификатором формата %f не имеет значения, является ли предоставленный аргумент типом float или double, он будет повышен до double в любом случае.

Документация верна: printf не видит разницы между float и double.

Параметры функций из семейства printf берутся через механизм переменной длины. В части переменной длины списка аргументов переменной длины применяются "повышения аргументов по умолчанию": типы char и short int повышаются до int, а float повышается до double.