Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Программирование / WORD / Лекции по ЯП (часть 3).doc
Скачиваний:
135
Добавлен:
15.04.2015
Размер:
1.34 Mб
Скачать

Операции языка Си. Приоритет операций

Операции языка Си и их приоритеты приведены в следующей таблице:

Прио-ритет

Операция

Название

Порядок

выполнения

1

()

Скобки, вызов функции

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

[]

Квадратные скобки, выделение элемента массива

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

.

Выделение элемента структуры или объединения

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

>

Выделение элемента структуры (объединения), адресуемой (го) указателем

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

2

!

Логическое отрицание

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

~

Побитовое отрицание

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

Изменение знака

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

+ +

Увеличение на единицу

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

– –

Уменьшение на единицу

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

&

Определение адреса

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

*

Обращение по адресу (содержимое адреса), разыменование

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

(тип)

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

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

sizeof

Определение размера в байтах

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

3

*

Умножение

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

/

Деление

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

%

Остаток от деления

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

4

+

Сложение

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

Вычитание

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

5

<<

Сдвиг влево

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

>>

Сдвиг вправо

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

6

<

Меньше

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

<= (!=>)

Меньше или равно

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

>

Больше

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

>= (!<)

Больше или равно

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

7

= =

Равно

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

!=

Не равно

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

8

&

Поразрядное И

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

9

^

Исключающее ИЛИ

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

10

|

Поразрядное ИЛИ

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

11

&&

Логическое И

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

12

||

Логическое ИЛИ

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

13

?:

Условная операция

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

14

=

Присваивание

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

*=

Умножение и присваивание

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

/=

Деление и присваивание

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

%=

Остаток и присваивание

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

+=

Сложение и присваивание

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

=

Вычитание и присваивание

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

<<=

Сдвиг влево и присваивание

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

>>=

Сдвиг вправо и присваивание

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

&=

Поразрядное И и присваивание

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

^=

Исключающее ИЛИ и присваивание

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

|=

Поразрядное ИЛИ и присваивание

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

15

,

Операция запятая

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

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

a = b;

a <op> = b;

a = b = c;

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

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

a=b=c=d=1;

<---------

Все присваивания имеют одинаковый приоритет и выполняются справа налево:

(a=(b=(c=(d=1))));

Здесь выражение (d=1) имеет значение 1, которое используется при присваивании. Т.о. строка присваиваний может быть рассмотрена как

d=1;

c=1;

b=1;

a=1;

Указанная особенность операции присваивания позволяет предельно кратко записывать громоздкие вычисления:

s1=a+b; |

s2=c+d; |---> s3 = ( s1=a+b ) + ( s2=c+d );

s3=s1+s2; | -----------------------

|__здесь мы искусственно повысили

приоритет операции присваивания

при помощи скобок

Си позволяет общее выражение вида A = A <op> B,

где <op> любая бинарная операция (кроме && и ||), заменять на А <op> = В.

Так, например, вместо А=А*В, вы можете написать А*=В.

При этом следует учитывать, что в краткой записи значение переменной вычисляется лишь один раз, тогда как в полной записи - два раза. Это бывает важно помнить в случаях, аналогичных данному

краткая форма

a[i++] += 2 --> это эквивалентно a[i]=a[i] +2; i++

---

|___постфиксная форма, т.е. порядок вычисления следующий: сначала a[i], а потом i++

полная форма

a[i] = a[i++] +2;