Дополнительно
Правильный спецификатор формата для двойного в printf
Какой правильный спецификатор формата для double
в printf? Это % f
или % lf
? Я считаю, что это % f
, но я не уверен.
Образец кода
#include <stdio.h>
int main()
{
double d = 1.4;
printf("%lf", d); // Is this wrong?
}
448
5
"% f"
- это (или хотя бы один) правильный формат для двойного. Там нет формата дляfloat
, потому что если вы попытаетесь передатьfloat
наprintf
, он будет повышен доdouble
до того, какprintf
получит его 1 < / sup >."% lf"
также приемлемо в соответствии с текущим стандартом -l
указывается как не имеющий эффекта, если за ним следует спецификатор преобразованияf
(среди прочих).Обратите внимание, что это одно место, где строки формата
printf
существенно отличаются отscanf
(иfscanf
и т. Д.).) форматировать строки. Для вывода вы передаете значение , которое будет продвигаться отfloat
доdouble
при передаче в качестве вариационного параметра. Для ввода вы 'повторная передача указателя , который не продвигается, поэтому вы должны сказатьscanf
, хотите ли вы прочитатьfloat
илиdouble
, так что дляscanf
,% f
означает, что вы хотите прочитатьfloat
, а% lf
означает, что вы хотите прочитатьdouble
(а также, для чего это 'стоит, для "длинного дубля", Вы используете% Lf
дляprintf
илиscanf
).& Лт; sub >
Учитывая стандарт C99 (а именно, проект N1256 ), правила зависят от вид функции: fprintf (printf, sprintf, ...) или сканф.
Вот соответствующие детали извлечены:
Те же правила, которые указаны для
fprintf
, применяются дляprintf
,sprintf
и аналогичных функций.Короче говоря, для
fprintf
указаны следующие спецификаторы и соответствующие типы:% f
- > двойной% Lf
- > длинный двойной.и для
fscanf
это:% f
- > плавать% lf
- > двойной% Lf
- > длинный двойной.Это может быть
% f
,% g
или% e
в зависимости от того, как вы хотите отформатировать число. Смотрите здесь для более подробной информации. Модификаторl
требуется вscanf
сdouble
, но не вprintf
.Правильный формат
printf
дляdouble
- это% lf
, точно так, как вы его использовали. В вашем коде нет ничего плохого.Формат
% lf
вprintf
не поддерживался в старых (до C99) версиях языка C, что создавало поверхностную «несоответствие» между спецификаторами формата дляdouble
вprintf
иscanf
. Это поверхностное несоответствие было зафиксировано в C99.Таким образом, в современном C имеет смысл предпочесть использовать
% f
сfloat
,% lf
сdouble
и% Lf
сlong double
последовательно как вprintf
, так и вscanf
,.% Lf
(обратите внимание на заглавную буквуL
) - это спецификатор формата для длинных парных разрядов.Для простых
doubles
подойдет либо% e
,% E
,% f
,% g
или% G
.