Вы передаете значение int
(«а») для формата %f
ожидающей float
или double
. Это неопределенное поведение, которое может привести к разным результатам для каждого выполнения одной и той же программы. Второй printf
имеет ту же проблему: %f
ожидает float
или double
, но вы передаете значение int
.
Вот исправленный вариант:
#include <stdio.h>
int main(void) {
int a = 50000;
float b = 'a';
printf("a = %d\n", a);
printf("b = %f\n", b);
printf("'a' = %d\n", 'a');
return 0;
}
Выход:
a = 50000
b = 97.000000
'a' = 97
Компиляция с большим количеством предупреждений включена, с аргументами командной строки -Wall -W -Wextra
позволяет компилятору выполнять больше проверок на непротиворечивость и жалуются на возможные ошибки программирования , Он обнаружил бы ошибки в размещенном коде.
Действительно clang
все еще жалуется на вышеприведенной коррекции:
clang -O2 -std=c11 -Weverything fmt.c -o fmt
fmt.c:8:24: warning: implicit conversion increases floating-point precision: 'float' to 'double' [-Wdouble-promotion]
printf("b = %f\n", b);
~~~~~~ ^
1 warning generated.
b
повышен до double
при передаче printf()
. Тип double
имеет большую точность, чем тип float
, который может выводить вводящие в заблуждение значения, если запрашиваются больше десятичных знаков, чем исходный тип.
Рекомендуется всегда использовать double
для вычислений с плавающей точкой и зарезервируйте float
типа для очень специфических случаев, когда лучше всего подходит, например, компьютерная графика API, некоторые бинарные форматы обмен ...
В первом 'printf' заявление, вы пытались напечатать' char' как 'float'. Это может быть частью дела. –
Использование несоответствующего формата и типа аргумента - это * неопределенное поведение *. –
Предупреждения вашего компилятора серьезны. – alk