Почему спецификация преобразования% lf не работает для Double in printf

Я пишу очень маленький код только scanf и printf . Я читаю двойное значение и печатаю его. Спецификация преобразования %lf работает правильно, чтобы читать двойное значение. Но это не работает с printf.

Когда я пытаюсь напечатать это значение, я получаю вывод, например, 0.000000

 double fag; scanf("%lf", &fag); printf("%lf", fag); 

Но, если я использую% f в printf, он работает правильно.

Используемая вами реализация стандартной библиотеки C не соответствует C99 (или новее). Изменения, перечисленные в предисловии (пункт 5), содержат:

%lf спецификатор преобразования разрешен в printf

Описание модификатора длины l ( C99 + TC3 7.19.6.1, пар. 7 , основное внимание):

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

Следовательно, %f и %lf эквивалентны. Оба ожидают double потому что аргументы, соответствующие эллипсису ( ... в int printf(char const * restrict, ...); ) подвергаются так называемым рекламным акциям по умолчанию. Среди прочего они неявно конвертируют float в double . Это не имеет значения для scanf() поскольку указатели неявно преобразуются.

Поэтому, если вы не можете или не хотите обновляться до новой стандартной библиотеки C, %f всегда можно использовать в строке формата printf() для печати float или double . Однако в строках формата scanf() %f ожидает float* и %lf ожидает double* .