Почему printf («значение:% f», 10/2);выход 0,000000? - PullRequest
0 голосов
/ 06 июля 2019

Я знал, что целочисленная арифметика будет обрезать дроби, но здесь она должна как минимум печатать 5. Почему она печатает 0.000000?

Ответы [ 2 ]

5 голосов
/ 06 июля 2019

Вызов printf имеет неопределенное поведение, поскольку спецификатор преобразования %f не соответствует типу выражения 10 / 2, равному int. Поскольку два операнда выражения 10 / 2 имеют тип int, результат имеет тип int, поскольку он является общим типом обоих операндов.

Используйте вместо этого как минимум 10.0 / 2. В этом случае выражение имеет тип double.

Или выведите целочисленное выражение 10 /2, используя спецификатор преобразования %d или %i, как

printf( "value: %d", 10 / 2 );

из стандарта C (7.21.6.1 функция fprintf)

9 Если спецификация преобразования недопустима, поведение undefined.275) Если какой-либо аргумент не является правильным типом для соответствующая спецификация преобразования, поведение не определено .

1 голос
/ 06 июля 2019

10 и 2 недопустимы float с. Они int с.

Чтобы ваша программа печатала правильный вывод, сделайте следующее:

printf("value:%f",10./2.);

Обратите внимание на . после каждого числа. Для компилятора это означает, что число является числом с плавающей запятой.

...