почему мы набираем? - PullRequest
       2

почему мы набираем?

1 голос
/ 26 октября 2010

Если я сделаю:

int i=3, j=10;
float f;
f=(i+j)/2;
so f won't get value 6.5 but 6.

Но,

f=(i+(float)j)/10;//edited 

будет f=6.5.В каком месте хранятся эти временные значения и зачем нам нужно приводить тип?

Ответы [ 3 ]

4 голосов
/ 26 октября 2010
f=(i+j(float))/10;

неверно;тип в приведении приходит перед его операндом:

f=(i+(float)j)/10;

В любом случае.При оценке арифметического оператора, если один операнд имеет тип с плавающей запятой, а другой - целочисленный тип, то целочисленный операнд преобразуется в тип с плавающей запятой, и выполняется арифметика с плавающей запятой.

Это частьиз того, что называется обычными арифметическими преобразованиями (вы можете узнать о них больше, воспользовавшись поиском в Google, хотя MSDN имеет простое объяснение того, чем они являются ).

Где хранится временное значение, зависит от компилятора и компьютера.Вероятно, он будет храниться в регистре, поскольку вы собираетесь использовать его немедленно, но он может храниться в стеке или где-то еще.

2 голосов
/ 26 октября 2010

C определяет правила «интегрального продвижения», которые определяют, какой тип будет использоваться для вычисления целых чисел. Целочисленное выражение будет преобразовано в тип, достаточно большой, чтобы в нем содержались все значения типов в выражении, если возможно, со знаком, иначе без знака. Приводя одно из значений к плавающему, вы заставляете компилятор выполнять продвижение с плавающей запятой, которое переводит все целые числа в подходящий тип с плавающей запятой. Вы также можете написать 0.1 * (i+j), в этом случае i+j будет вычислено как целое число, а затем будет преобразовано в тип с плавающей запятой для умножения на 0,1.

0 голосов
/ 30 декабря 2017

f = (i + j) / 2 даст целочисленное значение, потому что в RHS i, j, 2 все они целочисленные, поэтому результат будет сохранен в виде целого числа. например

 int a;
            float b;
            b=a;

там b будет хранить только целочисленное значение a, даже если вычисленное значение a является float. Здесь может быть таким же, как ваше выражение (i+j)/2.

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