Я столкнулся с проблемой при делении двух чисел и отображении результата с помощью printf. Я получаю странные цифры.

С std :: cout все работает нормально, но не с printf, почему?

Я всегда работаю с printf () в качестве вывода на экран и знаю, что можно работать и с std :: cout. (тот же результат)

int a;
int b;

float z = (float)a / (float) b;
printf("%d", z);

Lev

Ответов: 2

Ответы (2)

Поскольку printf является вариативной функцией, аргументы подвергаются только стандартным преобразованиям (например, char преобразуется в int), они не преобразуются автоматически в тип, соответствующий спецификатору формата. Спецификатор % d требует, чтобы его аргумент был int, но вы дали ему float, поэтому результаты будут мусором. Чтобы напечатать float, вы должны использовать % f:

printf("%f", z);

Когда вы используете cout << z, в этом нет необходимости, потому что << использует перегрузку функций для выполнения форматирования для конкретного типа.

Принцип работы printf заключается в том, что он принимает «переменные параметры». Это означает, что аргументы не известны внутри printf, вместо этого используется какой-то «волшебный» код для их возврата.printf использует строку формата, в данном случае "% d", чтобы определить тип аргумента - int в случае "% d «. Поскольку z на самом деле является float, он напечатает целочисленное представление z - что, вероятно, является действительно большим числом. [1]

Вы должны исправить свой код, чтобы использовать правильный формат, в этом случае "% f" кажется хорошим выбором.

Большинство современных компиляторов также имеют способ проверить соответствие строки формата и фактических переданных аргументов, поэтому вы должны включить предупреждения при компиляции кода, чтобы выдать вам осмысленное (ish) сообщение о том, что не передан правильный аргумент.

[1] По крайней мере, в x86-64 на Linux аргумент с плавающей запятой передается в регистры SSE и сохраняется в отдельном куске памяти, поэтому несоответствующие аргументы не будут печатать целочисленное представление чисел с плавающей запятой, а будет напечатано какое-то "случайное" "число, полученное из того места, где обычно передавались бы целые числа.

2022 WebDevInsider