Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
+ЭУМКД КИТ-ч1-Бутов.docx
Скачиваний:
9
Добавлен:
05.05.2019
Размер:
262.85 Кб
Скачать

Операции

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

Операции языка С в порядке убывания их приоритетов

Операции

Выполнение

1

2

() [] . ->

! ~ ++ -- + - * & (тип) sizeof

слева направо

справа налево

3

4

5

6

7

8

9

10

11

12

13

14

15

* / %

+ -

<< >>

< <= > >=

== !=

&

^

|

&&

||

?:

= += -= *= /= %= &= ^= |= <<= >>=

,

слева направо

слева направо

слева направо

слева направо

слева направо

слева направо

слева направо

слева направо

слева направо

слева направо

справа налево

справа налево

слева направо

В таблице операций первые две строки задают унарные операции, а все последующие – бинарные и одну тернарную (строка 13). Строки упорядочены по убыванию приоритетов операций, при этом операции, записанные в одной строке, имеют одинаковый приоритет. Например, операции *, / и % (строка 3) имеют одинаковый приоритет, который выше, чем приоритет бинарных операций + и - (строка 4).

Операции присваивания

Операции присваивания (строка 14) задают новое значение переменной и подразделяются на простые и сложные. Формат операции простого присваивания:

переменная = выражение

Механизм выполнения операции присваивания такой: вычисляется выражение и его результат заносится в память по адресу, который определяется именем переменной, находящейся слева от знака операции. То, что ранее хранилось в этой области памяти, теряется. Примеры с операцией присваивания:

int a, b = 5, c = 5;

float x = 1.0, y = 33.0;

a = b + c/2;

b = a;

x = x + 0.5;

Рассмотрим последний оператор. Сначала из ячейки памяти, в которой хранится значение переменной х, выбирается это значение. Затем к нему прибавляется 0.5, после чего полученный результат записывается в ту же самую ячейку, а то, что там хранилось ранее, теряется безвозвратно.

Необходимо отметить, что результат вычисления выражения характеризуется значением и типом, например, для b и с равных 5 выражение b + c/2 имеет значение 7 и тип int, т.к. при делении целых чисел дробная часть отбрасывается.

Если операнды, входящие в выражение, разного типа, то перед вычислениями выполняются преобразования более коротких типов в более длинные для сохранения значимости и точности. Такие преобразования называются неявным приведением типов и выполняются автоматически. При этом целочисленные константы имеют по умолчанию тип int, а вещественные – тип double. Например, выражение b + c/2.0 имеет значение 7.5 и тип double. Если же рассмотреть операторы:

a = b + c/2.0;

х = b + c/2.0;

то переменная а, поскольку она целого типа, получит значение 7, а переменная х, поскольку она вещественная, получит значение 7.5. Другие примеры:

х = 10.0 + 9/10; //х = 10.0

х = 10 + 9.0/10; //х = 10.9

х = 5/9*(у – 32.0); //х = 0 для любого значения у

х = 5*(у – 32)/9; //х = 0.555556 для у = 33.0

x = 5.0;

x = 5; //присваивание с неявным приведением типа int к типу float

unsigned char ch1 = 255, ch2;

a = ch1 + 1; //a = 256

ch2 = ch1 + 1; // ch2 = 0

Операция присваивания в отличие от большинства других операций является правоассоциативной, т.е. выполняется справа налево:

a = b = c означает a = (b = c)

Это отличается, например, от операции сложения, для которой a + b + c означает (a + b) + c. Поэтому можно выполнить такое присваивание: a = b = c = 10; (вместо цепочки: a = 10; b = 10; c = 10;).

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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]