Почему %lf не работает с двойниками в printf, а %f работает?

Когда я компилирую и запускаю следующий фрагмент кода, результат равен 0,000000.

#include <stdio.h>

int main(void)
{
    double a = 1.4;

    printf("%lf", a);

    return 0;
}

Когда я компилирую и запускаю этот фрагмент кода, результат равен 1.400000, как я и ожидал для первого фрагмента.

#include <stdio.h>

int main(void)
{
    double a = 1.4;

    printf("%f", a);

    return 0;
}

Почему это так? %lf — это спецификатор формата для двойников, поэтому не должен ли первый фрагмент иметь тот же вывод, что и второй?

Кто-то задал аналогичный вопрос (Правильный спецификатор формата для double в printf) но, согласно лучшим ответам, два фрагмента должны давать одинаковый результат, поскольку «l указано как не имеющее эффекта, если за ним следует спецификатор преобразования f (среди прочего)» (цитируется из первого ответа).

Я использую кодовые блоки в качестве IDE, и я заставил компилятор gcc следовать стандарту 1999 года для C. Возможный дубликат говорит, что мой код должен работать в соответствии со стандартом C99, которому следует мой компилятор, но мой код не работает. Поэтому ответ в дубликате не решает мою проблему.


person Community    schedule 26.10.2017    source источник


Ответы (1)


Цитата C11, глава §7.21.6.1/ параграф 7 (выделено мной) [и глава §7.19.6.1, C99, если вам интересно]

Модификаторы длины и их значения:

[.....]

l (ell)

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

Если ваш компилятор не подчиняется этому, это проблема с соответствием компилятора.

Ваш код в порядке, оба фрагмента идентичны.

Смотрите здесь

person Sourav Ghosh    schedule 26.10.2017
comment
Это помогает мне, говоря мне, что с моим кодом нет проблем, но не решает мою проблему. Я думаю, что это как-то связано с кодовыми блоками, потому что я поставил галочку в настройках, чтобы использовать компилятор, соответствующий стандарту c99. Ваш ответ по-прежнему относится к стандарту C99, верно? - person ; 26.10.2017
comment
@programmer5934 абсолютно. Глава §7.19.6.1, C99, если вам интересно. - person Sourav Ghosh; 26.10.2017
comment
@programmer5934 для полноты картины, единственный стандарт, не разрешающий l здесь, - это самый старый, C89/C90. - person ; 26.10.2017