Использование функции printf - PullRequest
2 голосов
/ 16 октября 2011

Я никогда не задумывался о поиске printf, так как начал изучать C ++ без C. Теперь я хочу использовать форматированный вывод в каком-то проекте. поэтому я ищу некоторые ссылки, которые могут объяснить разницу между использованием потоков printf и IO.

Одно из моих сомнений:

float f = 1.5;
printf("%d", f);

Почему он печатает ноль? FWIK это должно быть переосмысление float, как int это правда?

Ответы [ 5 ]

7 голосов
/ 16 октября 2011

Это фактически вызывает неопределенное поведение (UB). Если спецификатор формата не совпадает с типом аргумента, переданного printf, то это UB, что означает, что может произойти все что угодно. Может печатать 0 или 9878978 или любой мусор. Может произойти что угодно, совершенно непредсказуемое.

Используйте %f, если тип данных аргумента float.

4 голосов
/ 16 октября 2011

Когда вы пишете printf("%d", f);, тип f должен быть int. Код, который вы написали, вызывает неопределенное поведение. Взято из ответ на аналогичный вопрос :

в документации по fprintf (7.19.6.1/9), которая также применяется к printf, в ней прямо говорится, что если какой-либо аргумент не является правильным типом для спецификатора формата - для неизмененного% d, то есть int, - тогда поведение не определено.


Почему он печатает ноль?

Может быть, у них кончились носовые демоны ?

2 голосов
/ 16 октября 2011

Поскольку %d предназначен для печати целых чисел, не плавает. Вам нужна одна из строк формата с плавающей запятой, например %f.

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

См. здесь , чтобы узнать о том, что может пойти не так, если у вас есть такое несоответствие.

0 голосов
/ 16 октября 2011

если вы не хотите использовать спецификатор формата% d, то вам лучше Type приведите его явным образом, чтобы избежать вызова UB (Undefined Behavior).

float f = 1,5; Е ( "% d", (целое) е);

0 голосов
/ 16 октября 2011

Да, у вас уже есть ответ, %d будет печатать только целые значения. Используйте «%f», который обозначает значения с плавающей точкой. Если вы используете %f, вы получите 1.500000

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...