Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Рацеев С.М. Программирование на языке Си.pdf
Скачиваний:
366
Добавлен:
23.03.2016
Размер:
1.65 Mб
Скачать

Если какой-либо из операндов принадлежит типу long double, то и остальные приводятся к long double.

В противном случае, если какой-либо из операндов принадлежит типу double, то и другие приводятся к double.

В противном случае, если какой-либо из операндов принадлежит типу float, то и остальные приводятся к float.

В противном случае, если какой-либо из операндов принадлежит типу unsigned long, то и остальные приводятся к типу unsigned long.

В противном случае, если какой-либо из операндов принадлежит типу long, то и остальные приводятся к типу long.

В противном случае, если какой-либо из операндов принадлежит типу unsigned int, то и остальные приводятся к типу unsigned int.

В противном случае, если операнды имеют тип unsigned short и/или unsigned char, то они преобразуются к unsigned int.

В противном случае все операнды приводятся к типу int.

1.2. Операции и выражения

Арифметические операции. К ним относят сложение (+),

вычитание (-), умножение (*), деление (/), остаток от деления (%). Деление целых чисел сопровождается отбрасыванием дробной части. Выражение a % b дает остаток при делении a на b. Например, после выполнения следующей части программы

int a = 5, b = 3, q, r; q = a / b;

r = a % b;

переменная q будет иметь значение 1, а r будет равно 2.

Заметим, что операция % применяется только к целым числам.

Операции сравнения и логические операции. К операциям сравнения относят следующие операции: больше или равно (>=), больше (>), меньше или равно (<=), меньше (<), равно (==), не рав-

13

но (!=), а к логическим оп ерациям – логическое И (&&), логическое ИЛИ (||), отрицание НЕ (!).

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

Для произвольного выражения A будут выполнены следующие равенства:

A && ложь = ложь,

A && истина = A,

A || ложь = A,

A || истина = истина.

Выражения, между которыми находятся операции && и ||, вычисляются слева направо, причем вычисление значения выражения прекращается сразу же, как только становится ясно, каким будет результат – истинным или ложным. Заметим, что приоритет операции && выше приоритета операции ||.

Например, пусть определены целые переменные x и y с инициализацией начальных значений:

int x = 1, y = 2;

В логическом выражении

…(x > y && y > 0)…

сначала вычисляется значение выражения x > y, которое в данном случае является ложным (нулевым). Так как для истинности логического выражения вида A && B, где A и B – некоторые выражения, необходимо и достаточно, чтобы и A, и B были истинными выражениями, то выражение (x > y && y > 0) примет ложное значение. Поэтому компилятор не будет вычислять значение выражения y > 0.

Аналогично, пусть x = 1, y = 2. Тогда значение выражения

…(y > x && x > 0 || x == y && x > 0)…

будет истинным, так как уже истинно выражение y > x && x > 0 , поэтому нет необходимости вычислять значение выражения x == y && x > 0 (напомним, что выражение вида A || B истинно

14

тогда и только тогда, когда истинно хотя бы одно из выражений A или B).

Из сказанного выше следует, что первым операндом операции && эффективнее ставить тот, у которого наибольшая вероятность оказаться ложным. А для операции ||, наоборот, в качестве первого операнда лучше ставить тот, у которого наибольшая вероятность оказаться истинным.

Операция присваивания. Общий вид операции присваивания следующий:

имя_переменной = выражение Например:

double x, y, z; /* определяем три действительные переменные

*/

x = 0.2;

/* переменной x присваиваем значение 0.2

*/

y = 0.5;

/* переменной y присваиваем значение 0.5

*/

z = x + y;

/* переменной z присваиваем сумму значений x и y */

Поскольку результатом выражения с операцией присваивания является значение выражения, стоящего справа от операции присваивания, то выражения присваивания могут быть вложенными, например x = y = 0. Здесь сначала будет выполнено присваивание y = 0, после которого переменная y будет равна нулю, а затем это значение будет присвоено переменной x.

В языке Си принято следующее правило: любое выражение с операцией присваивания, заключенное в круглые скобки, имеет значение, равное присваиваемому выражению. Например, выражение (x = 1 + 2) имеет значен ие 3. Поэтому можно записать такое выражение:

y = (x = 1 + 2) + 4,

где переменной y присваивается значение 7, а переменная x будет иметь значение 3. Учитывая данное обстоятельство, можно также записывать логические выражения с операцией присваивания, например

((x = 1 + 2) < 4),

которое в данном случае является истинным.

15

В языке Си для компактной записи выражений, где участвуют операция присваивания, имеются следующие специальные арифметические операции:

Операция

Пример

Эквивалент

+=

a += 10;

a = a + 10;

-=

a -= 2;

a = a – 2;

*=

a *= 5;

a = a * 5;

/=

a /= 10;

a = a / 10;

%=

a %= 3;

a = a % 3;

Операции инкремента и декремента. Очень часто в про-

граммах к переменной прибавляется единица или от переменной единица вычитается. Увеличение значения на 1 называется инкрементом, а уменьшение на 1 – декрементом. Для данных действий предусмотрены специальные операции: операция инкремента (++), которая увеличивает значение переменной на 1, и операция декремента (--), которая, в свою очередь, уменьшает значение переменной на 1. Например, пусть переменная x имеет тип double. Следующие три выражения приведут к одному и тому же результату:

x++;

x = x + 1;

x += 1;

Операции инкремента и декремента работают в двух вариантах: префиксном и постфиксном. Префиксный вариант записывается перед именем переменной (++x), а постфиксный – после нее (x++). В простых выражениях, например

x++; и ++x;

оба варианта равносильны. В сложном же выражении (например, если в выражении присутствует операция присваивания и операция инкремента или декремента) префиксный и постфиксный варианты приведут к различным результатам. Префиксная операция выполняется до операции присваивания, а постфиксный – после нее. Например, после следующей части программы переменная y будет иметь значение 2:

x = 1;

y = ++x;

16