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

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

Пріоритет і асоційованість операцій впливають на порядок групування операндів і порядок обчислень у виразах С. Наприклад, пріоритет виконання операцій необхідно враховувати при обчисленні складних арифметичних формул. Операції, які приведені в одній групі таблиці 6.2, мають однаковий пріоритет і асоційованість. Порядок убування пріоритету в таблиці - зверху вниз.

Таблиця 6.2 - Пріоритет і асоційованість операцій

Прі-ори-тет

Знак операції

Тип операції

Асоційованість (порядок виконання)

( ) [ ] . –>

Первинні

→ (зліва праворуч)

~ ! * &

++ - - sizeof( )

приведення типів ( )

Унарні

(справа ліворуч)

* / %

Мультиплікативні

+ -

Адитивні

<< >>

Зрушення

< > <= > =

Відношення

= = ! =

Відношення

&

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

^

Поразрядне “Або, що вилучає "

|

Поразрядне “Або"

&&

Логічне "І"

| |

Логічне “Або"

? :

Умовна (тернарна)

=

* =

/ =

% =

Просте і складене присвоювання

+ =

– =

<< =

>> =

& =

| =

^ =

,

Послідовне обчислення

(кома)

Якщо кілька операцій одного пріоритету зустрічаються у виразі, то вони застосовуються відповідно до асоційованості.

Приклади:

а = 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; int f(int x, int y);

z = x > y  f(x, y); //Якщо x > y, то значення z = 1 «Істина», а

//функція f(x, y) не викликається.

//Якщо x y, то f(x, y) викликається, тоді:

// z = 0, якщо f(x, y) повертає нульове значення, чи

//z = 1, якщо f(x, y) повертає не нульове значення

printf (“%d %d \n“, ++n, f(2, n)); //У функцію f(x, y) може

//передаватися n чи n+1

Перетворення типів

У виразах С перемінні різних типів у ряді випадків можуть використовуватися спільно, наприклад, перемінні типу char можуть бути присутніми у виразах одночасно з перемінними типу int.

Приклад спільного використання цілих і символьних перемінних

char ch = 'а', ans; //Оголошення перемінних ch і ans

printf("Значення ch + 3 = %d", ch + 3); // Виведення значення ch+3

ans = ch % 3; //Визначення залишку від цілочисленого розподілу

printf("\n\n Значення ans = % d\n", ans);

Оскільки char є цілим типом, для нього можуть бути застосовані всі операції, операнди яких мають тип int. Цілі за умовчанням - це величини зі знаком signed.

З перемінними речовинного типу (float, double і ін.) можуть бути застосовані всі операції, допустимі для цілого типу int, за винятком операції залишку від розподілу ( % ).

Перетворення типів бувають явні і неявні. Синтаксис операції явного перетворення типу