модификатор длины ' 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 ответа:
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
.