Поскольку вы объявляете fahr
как float
, любое присвоенное ему значение будет преобразовано в float
.
Любая арифметическая операция между int
и float
будет иметь результат float
.Это указывается как часть обычных арифметических преобразований :
6.3.1.8 Обычные арифметические преобразования
1 Многие операторы, ожидающие операнды арифметического типа, вызывают преобразования и приводят к типам результатаАналогичным образом.Цель состоит в том, чтобы определить общий реальный тип для операндов и результата.Для указанных операндов каждый операнд преобразуется без изменения типа домена в тип, соответствующий действительный тип которого является общим действительным типом.Если явно не указано иное, общий действительный тип также является соответствующим действительным типом результата, чья область типов является областью типов операндов, если они одинаковы, и сложной в противном случае.Этот шаблон называется
обычными арифметическими преобразованиями :
Сначала, если соответствующий действительный тип одного из операндов равен long double
, другой операнд преобразуется без изменения домена типа втип, для которого соответствующий действительный тип равен long double
.
В противном случае, если соответствующий действительный тип одного из операндов равен double
, другой операнд преобразуется без изменения домена типа в тип, соответствующий действительному типуis double
.
В противном случае, если соответствующий действительный тип одного из операндов равен float
, другой операнд преобразуется без изменения в домен типа в тип, соответствующий действительный тип которого равен float
. 62)
В противном случае целочисленные преобразования выполняются для обоих операндов.Затем к продвигаемым операндам применяются следующие правила:
Если оба операнда имеют одинаковый тип, дальнейшее преобразование не требуется.
В противном случае, если оба операнда имеют целочисленные типы со знаком или оба имеютцелочисленные типы без знака, операнд с типом ранга преобразования меньшего целого числа преобразуется в тип операнда с большим рангом.
В противном случае, если операнд с целочисленным типом без знака имеет ранг, больший или равный рангутипа другого операнда, тогда операнд с целочисленным типом со знаком преобразуется в тип операнда с целочисленным типом без знака.
В противном случае, если тип операнда с целочисленным типом со знаком может представлять всезначения типа операнда с целым типом без знака, затем операнд с целым типом без знака преобразуется в тип операнда с целым типом со знаком.
В противном случае оба операнда преобразуются в целочисленный тип без знакасоответствующий типуоперанда со знаком целого типа.
62) Например, добавление double _Complex
и float
влечет за собой только преобразование операнда float
в double
(и дает результат double _Complex
).
C 2011 Черновик в режиме онлайн
Арифметическая операция между двумя int
с даст результат int
.Например, 1/2
приводит к 0
, 4/3
возвращает 1
, 7/3
дает 2
и т. Д. Если вы присваиваете результат целочисленного деления переменной float
, он будет сохранен какfloat
, но вы не получите дробную часть результата.IOW, учитывая код как
float fahr = 4 / 3;
printf( "%f\n", fahr );
, ваш вывод будет 1.0
, а не 1.33333
.Если вы хотите получить результат с плавающей точкой, по крайней мере один из операндов должен иметь тип с плавающей точкой:
float fahr = 4 / 3.0f;
printf( "%f\n", fahr );
будет выводить 1.33333
.