C float или double в спецификаторе формата printf и функции pow

#include <stdio.h>
#include <math.h>

int main(void){

   printf("%lf\n", pow(1.0, 2.0));
   printf("%f\n", pow(1.0, 2.0));

   return 0;    
}

Первый printf() дает вывод 0.000000 но второе printf() дает вывод 1.000000, Зачем?

Использование кодовых блоков в Windows 7 64 бит.

Использование команды gcc для компиляции дает мне.exe, который выводит 1.000000 для обоих операторов.

Если я скомпилирую нажатие клавиши F9 на кодовых блоках, я получу 0,000000 для первого оператора и 1,000000 для второго.

Наконец, если я удалю #include <stdio.h> из исходного кода в Codeblocks, все дают мне 1,000000 (без предупреждений или ошибок).

1 ответ

Ваш код должен напечатать одинаковое значение для обеих строк в компиляторе C99 или C11. Все float аргументы printf всегда преобразуются в double, а также %lf а также %f оба делают одно и то же (распечатать double).

В стандарте C89 %lf Спецификатор неопределенного поведения и doubles должен быть напечатан только с %f, Так что, возможно, вы используете старый компилятор, который не поддерживает стандарт C99.

Соответствующие разделы стандартов, касающиеся %lf:

С99, 7.19.6.1/7:

l (ell) [...] не влияет на следующий спецификатор преобразования a, A, e, E, f, F, g или G.

С89, 4.9.6.1:

[...] необязательный l (ell), указывающий, что следующий спецификатор преобразования d, i, o, u, x или X применяется к аргументу long int или unsigned long int; необязательный l, указывающий, что следующий n спецификатор преобразования применяется к указателю на длинный аргумент int; [...] Если h, l или L появляются с любым другим спецификатором преобразования, поведение не определено.

Другие вопросы по тегам