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