Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
lab_cpp.doc
Скачиваний:
10
Добавлен:
07.06.2015
Размер:
2.81 Mб
Скачать

Приоритет операций и порядок выполнения (ассоциативность)

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

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

Таблица 6.2 - Приоритет операций

Приоритет

Знак операции

Тип операции

Ассоциативность (порядок выполнения)

() [ ] .–>

Первичные

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

~ ! * & ++ -- sizeof, приведение типов ( )

Унарные

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

* / %

Мультипликативные

+ -

Аддитивные

<< >>

Сдвиги

< > <= > =

Отношение

= = ! =

Отношение

&

Поразрядное "и"

^

Поразрядное исключающее "или"

|

Поразрядное включающее "или"

&&

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

Продолжение таблицы 6.2

Приоритет

Знак операции

Тип операции

Ассоциативность (порядок выполнения)

| |

Логическое "или"

? :

Условная (тернарная)

=

* =

/ =

% =

Простое и составное присваивание

+ =

=

<< =

>> =

& =

| =

^ =

,

Последовательное вычисление

Если несколько операций одного приоритета встречаются в выражении, то они применяются в соответствии с ассоциативностью.

Примеры. а = b&хFF + 5; // вычисляется как а = b&(х FF + 5);

b=а + с >> 1; // как b=(а +с) >> 1;

с = а + + + b/5; // как с=(а + +) + ( b/5);

Мультипликативные, аддитивные и поразрядные операции обладают свойством коммутативности. Компилятор вычисляет выражения с учётом приоритета в любом порядке, даже если есть скобки. Определённый порядок вычисления (,) операндов гарантируют операции: последовательного вычисления, логические «И» (&&) и «ИЛИ» (), условная операция (? :).

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

func (i + 1, i = j + 2); //. Не гарантирует порядок вычисления фактических

// аргументов

i= 0; // i имеет тип int по умолчанию

a [++ i] = i; // порядок вычисления левого и правого операндов не // гарантируются a [0] = 0 или a[1]=1

(x - 5) && ++ i // Если x =5, то ++ i не вычисляется

int x, y, z, f();

z = x > y  f(x, y); // Если x > y, то значение z = 1 «Истина», а f( ) –не

// вызывается

// если x y, то f() вызывается, тогда z=0,

// eсли f( ) возвращает нулевое значение, или z = 1,

// если f( ) возвращает не нулевое значение

// printf (“%d %d \n“, ++n, p()2, n)

// в функцию может передаваться n или n+1.

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