logo search
Подбельский Фомин_Программирование на языке СИ_

1.6. Выражения и приведение арифметических типов

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

В арифметических выражениях допустимы следующие операции:

+ - сложение (или унарная операция +);

- - вычитание (или унарная операция изменения знака);

* - умножение;

/ - деление;

% - деление по модулю (т.е. получение остатка от целочисленного деления первого операнда на второй).

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

Примеры выражений с двумя операндами:

Нужно быть аккуратным, применяя операцию деления ‘\’ к целочисленным операндам. Например, как мы уже упоминали выше, за счет округления результата значением выражения 5/3 будет 1, а соответствует ли это замыслам программиста, зависит от смысла той конкретной конструкции, в которой это выражение используется.

Чтобы результат выполнения арифметической операции был вещественным, необходимо, чтобы вещественным был хотя бы один из операндов. Например, значением выражения 5.0/2 будет 2.5, что соответствует смыслу обычного деления.

Операции *, /, % (см. табл. 1.4) имеют один ранг (3), операции +, - также один ранг (4), но более низкий. Арифметические операции одного ранга выполняются слева направо. Для изменения порядка выполнения операций обычным образом используются скобки. Например, выражение (d+b)/2.0 позволяет получить среднее арифметическое операндов d и b.

Как уже говорилось, введены специфические унарные операции ++ (инкремент) и -- (декремент) для изменения на 1 операнда, который в простейшем случае должен быть переменной (леводопустимым значением). Каждая из этих операций может быть префиксной и постфиксной:

• выражение ++m увеличивает на 1 значение m, и это полученное значение используется как значение выражения ++k (префиксная форма);

• выражение -- k уменьшает на 1 значение k, и это новое значение используется как значение выражения --k (префиксная форма);

• выражение i++ (постфиксная форма) увеличивает на 1 значение i, однако значением выражения i++ является предыдущее значение i (до его увеличения);

• выражение j-- (постфиксная форма) уменьшает на 1 значение], однако значением выражения j--является предыдущее значение j (до его уменьшения).

Например, если n равно 4, то при вычислении выражения n++*2 результат равен 8, а n примет значение 5. При n, равном 4, значением выражения ++n*2 будет 10, а n станет равно 5.

Внешнюю неоднозначность имеют выражения, в которых знак унарной операции ++ (или --) записан непосредственно рядом со знаком бинарной операции +:

х+++b или z---d

В этих случаях трактовка выражений однозначна и полностью определяется рангами операций (бинарные аддитивные + и - имеют ранг 4; унарные ++ и -- имеют ранг 2). Таким образом:

x +++b эквивалентно (x++)+b

z --d эквивалентно (z--)-d