Пріоритети операцій - WinAVR та AVR Studio - Програмування - Інструкції - Придністровський портал
Кожна операція має свій пріоритет, який визначає порядок обчислення операції у виразі: якщо зліва направо слідують поспіль кілька операцій однакового пріоритету, порядок їх обчислення не визначено, але результат обчислення гарантовано буде вірним, в іншому випадку обчислюються раніше операції з найбільшим пріоритетом, а потім - з меншим. Порядок обчислень може бути змінений за допомогою круглих дужок: вираз у дужках обчислюється завжди насамперед, тобто. має найвищий пріоритет.
У таблиці перераховані всі операції із зазначенням їх пріоритетів:
| Операція | Пріоритет |
| ! |
«унарні плюс і мінус» ++ -? операція розіменування покажчика *
Так як запам'ятати всі пріоритети досить непросто, бажано спочатку (і не забороняється взагалі завжди) вказувати порядок обчислень за допомогою дужок.
var = (5 2) + 2; // змінної var буде присвоєно значення 2
var = (5 & gt; = 2) + 2; // змінної var буде присвоєно значення 3
Особливу увагу слід звертати на пріоритет операцій:
var = (5 > 2) + 2; // var = 3
var = 5 & gt; 2 + 2; // var = 0
У другому виразі вищий пріоритетмає арифметична операція додавання, тому змінній var буде надано значення виразу 5 > 4, що брехливо, тобто. var дорівнюватиме 0.
Найбільш простою та універсальною порадою буде використання дужок скрізь, де необхідно точно гарантувати порядок обчислень - у цьому випадку можна вважати (звичайно, лише умовно!) всі оператори рівнопріоритетними, а порядок обчислень визначати лише за допомогою дужок. Можливо, це призведе до деякої зайвої «скобочності» програми, проте гарантує, що плани програміста не розійдуться з думкою компілятора.
Згадані раніше унарні оператори інкременту та декременту – одна з цікавих особливостей мови Сі. Ці оператори можуть застосовуватися тільки до операнда-змінної, і в жодному разі не до операнда-константи. Але головне, можуть бути префіксними і постфіксними, тобто. записуватися або ліворуч від змінної, або праворуч:
var++; // Тепер var = 2
--var; // Тепер var = 1
Здавалося б, до чого два способи виконати те саме? Справа в тому, як буде використаний результат оператора при обчисленні виразів. Ось приклад:
int b = var++ - 5; // var стає рівним 6
int з = ++var - 5; // var стає рівним 7
Змінна Ь виявиться рівною 0, а змінна з дорівнюватиме 2. Вся справа в тому, що при постфіксному операторі ++ спочатку використовується значення змінної у виразі, а потім виконується оператор інкременту, а при префіксному записі - спочатку виконується оператор інкременту, а потім вже оновлене значення змінної використовується для обчислення виразу.
Оператори побітового зсуву і виконують переміщення бітів операнда зліва на кількість розрядів, задане виразом справа. Як було зазначено, ці оператори зберігають знак лівогооперанда, якщо операнд – число зі знаком. Заповнення «розрядів, що звільняються» для беззнакових чисел відбувається нулями.
Унарні логічні операції та операція побітової інверсії мають лише один варіант обчислення. Але, на жаль, на цьому прості оператори закінчуються, всі інші оператори мають більш складну форму запису і, відповідно, виконують більш складні дії, заслуговуючи на окремий розгляд.