Главная » 2013 » Февраль » 11 » 8. Выражения
20:33
8. Выражения
Выражения

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

Примеры выражений:

(а + 0.12)/6
 х && у || !z
(t * sin(x)-1.05e4)/((2 * k + 2) * (2 * k + 3))

Операции выполняются в соответствии с приоритетами. Для изменения порядка выполнения операций используются круглые скобки. Если в одном выражении записано несколько операций одинакового приоритета, унарные операции, условная операция и операции присваивания выполняются справа налево, остальные – слева направо. Например, в выражении а = b = с сначала b = c, а затем a = b, выражение a + b + c выполняется как (а + b) + с. Порядок вычисления подвыражений внутри выражений не определен: например, нельзя считать, что в выражении (sin(x + 2) + cos(y + 1)) обращение к синусу будет выполнено раньше, чем к косинусу, и что х + 2 будет вычислено раньше, чем y + 1.
Результат вычисления выражения характеризуется значением и типом. Например, если а и b – переменные целого типа и описаны так:
int а = 2, b = 5;
то выражение а + b имеет значение 7 и тип int, а выражение а = b имеет значение, равное помещенному в переменную а (в данному случае 5) и тип, совпадающий с типом этой переменной. Таким образом, в C++ допустимы выражения вида а = b = с: сначала вычисляется выражение b = с, а затем его результат становится правым операндом для операции присваивания переменной а.

Преобразование типов в выражении.

В выражение могут входить операнды различных типов. Если операнды имеют одинаковый тип, то результат операции будет иметь тот же тип. Если операнды разного типа, перед вычислениями выполняются преобразования типов по умолчанию или явно. Преобразования бывают двух видов:
-    изменяющие внутреннее представление величин (с потерей точности или без потери точности);
-    изменяющие только интерпретацию внутреннего представления.
К первому виду относится, например, преобразование целого числа в вещественное (без потери точности) и наоборот (возможно, с потерей точности), ко второму – преобразование знакового целого в беззнаковое.
По умолчанию преобразование осуществляется по определенным правилам, обеспечивающим преобразование более коротких типов в более длинные для сохранения значимости и точности. На каждом шаге оценки выражения выполняется одна операция, и имеются два операнда. Если их тип различен, операнд меньшего "ранга экстенсивности” приводится к типу более "экстенсивного”. Под экстенсивностью понимается диапазон значений, который поддерживается данным типом. По возрастанию экстенсивности типы следуют в очевидном порядке:

char
short
int, long
float
double
long double

Ниже приведена последовательность преобразований.
Любые операнды типа char, unsigned char или short преобразуются к типу int по правилам:
-    char расширяется нулем или знаком в зависимости от умолчания для char;
-    unsigned char расширяется нулем;
-    signed char расширяется знаком;
-    short, unsigned short при преобразовании не изменяются.
Затем два операнда становятся либо int, либо float, double или long double. Причем, если один из операндов имеет тип float, то другой преобразуется к типу float; если один из операндов имеет тип double, то другой преобразуется к типу double; если один из операндов имеет тип long double, то другой преобразуется к типу long double.
Таким образом операнды преобразуются к типу наиболее длинного из них, и он используется как тип результата (не путать с оператором присваивания).
Кроме того, если в операции участвуют знаковый и беззнаковый целочисленные типы, то знаковый операнд приводится к беззнаковому типу. Результат тоже будет беззнаковым. Во избежание ошибок нужно точно представлять себе, что при этом происходит, и при необходимости применять операцию приведения, явно преобразующую тот или иной операнд.
Некоторые считают, что в выражении все операнды заранее приводятся к наиболее экстенсивному типу, а уж потом производится оценка. Это не так. Приведение типов выполняется последовательно для каждой текущей пары операндов.
Явное преобразование типа выполняется посредством операции приведения  (тип)  и может применяться к любому операнду в выражении, например:

р = р0 + (int)(pReal + 0.5); // Округление pReal

Следует иметь в виду, что операция приведения типа может работать двояким образом. Во-первых, она может производить действительное преобразование данных, как это происходит при приведении целого типа к вещественному и наоборот. Получаются совершенно новые данные, физически отличные от исходных. Во-вторых, операция может никак не воздействовать на имеющиеся данные, а только изменять их интерпретацию. Например, если переменную типа short со значением -1 привести к типу unsigned short, то данные останутся теми же самыми, но будут интерпретироваться по-другому (как целое без знака), в результате чего будет получено значение 65535.
Категория: С++ Builder | Просмотров: 478 | Добавил: Andre99 | Рейтинг: 0.0/0
Всего комментариев: 0
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]