Почему добавление с плавающей точкой и int приводит к получению с плавающей точкой? - PullRequest
0 голосов
/ 15 февраля 2019

Я сейчас читаю "Язык программирования Си - 2-е издание".В первой главе объясняется, что операция с плавающей точкой с int приводит к int.Вот эта программа:

#include <stdio.h>

int main()
{
    float fahr, celsius;
    int lower, upper, step;

    lower = 0;
    upper = 300;
    step = 20;

    fahr = lower;
    while (fahr <= upper)
    {
        celsius = (5.0/9.0) * (fahr-32.0);
        printf("%3.0f\t%6.1f\n", fahr, celsius);
        fahr = fahr + step;
    }
}

Когда строка fahr = fahr + step выполнена, не должно ли fahr стать int?Останется ли он поплавком, потому что я был объявлен как поплавок?

Ответы [ 4 ]

0 голосов
/ 15 февраля 2019

Поскольку вы объявляете 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.

0 голосов
/ 15 февраля 2019

Да, если вы объявили переменную как число с плавающей точкой, она не изменится в вашем коде.Если вы сделаете операцию между int и float и поместите переменную float, вы получите результат с плавающей запятой, и наоборот: если вы поместите переменную в int var, вы потеряете десятичную часть вашего числа..

Вы не можете изменить тип переменной в C.

0 голосов
/ 15 февраля 2019

+ 1 За чтение этой книги.C выбирает самое высокое разрешение по арифметике, поэтому float выигрывает в вашем случае.

0 голосов
/ 15 февраля 2019

Если в книге сказано, что это неправильно.Все просто!

Когда вы добавляете целое число к числу с плавающей точкой, вы получаете число с плавающей точкой.Кроме того, вы присвоили результат на float, поэтому он не может быть ничем иным.Объекты не меняют тип.

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