Вирази в мові С ++ - це послідовність операндів, операцій і символів-роздільників. Операнди - це змінні, константи або інші вирази. Роздільниками в С ++ є символи [] () <>. ;. * = #, Кожен з яких виконує свою функцію. Вираз може складатися з однієї або більше операцій і визначати виконання цілого ряду елементарних кроків по перетворенню інформації. Компілятор дотримується суворий порядок інтерпретації виразів, званий правилами передування. Цей порядок може бути змінений, якщо окремі частини виразу укласти в круглі дужки. Елементарна операція по перетворенню інформації задається знаком операції. За кількістю операндів беруть участь в операції розрізняють дві групи операцій: унарні (один операнд) і бінарні (два операнда). За типом виконуваної операції розрізняють арифметичні, порозрядні, логічні, привласнення, операції відносини і ін.
Основні операції і їх пріоритет
Мова С ++ включає стандартний набір арифметичних операцій додавання (задається знаком +), віднімання (-), множення (*), ділення (/), які не потребують особливого пояснення. Специфічними для З ++ є операції визначення залишку (%), инкремента (++) і декремента (-). Операцію% пояснює наступний приклад:
int a = 5, b = 2, c = 0, d;
d = a% b; / * D = 1 - залишок від цілого ділення 5/2 * /
d = a% c; / * Повідомлення про помилку ділення на 0 * /
Операції інкремента і декремента відповідно збільшують і зменшують операнд на 1. Операції ++ і - можуть застосовуватися тільки до змінних. Існують дві форми їх запису: префиксная, коли операнд розташовується праворуч від знака операції, і Постфіксний, коли операнд розташовується перед знаком операції. У префиксной формі спочатку виконується збільшення операнда на 1 і збільшене значення використовується у виразі. У постфіксной формі спочатку береться значення операнда і тільки після цього його значення збільшується на 1. Наприклад:
int a = 0, b = 1, c;
c = a ++; / * C дорівнює 0, а так само 1 * /
c = ++ a; / * Тепер з = 2, а = 2 * /
Форма запису операцій ++ і - позначається в складових виразах. Ясно, що немає жодної різниці між поодинокими виразами a ++; і ++ a; b--; і -b;
Порозрядні логічні операції
С ++ підтримує такі порозрядні логічні операції:
поразрядное логічне І (AND);
^ Порозрядне додавання по модулю 2 (XOR - що виключає або);
| поразрядное логічне АБО (OR);
Кожен біт результату визначається по бітам операндів так, як це показано в табл. 8.
Інверсія вимагає використання єдиного операнда праворуч від знака
Результат утворюється поразрядной інверсією всіх бітів операнда. приклади:
int s = 0x53c9, mask = 0x356c, r_or, r_and, r_xor, r_inv;
r_or = s | mask; / * R_or = 0x77ed * /
r_and = s&mask; / * R_and = 0x1148 * /
r_xor = s ^ mask; / * R_xor = 0x66a5 * /
Порозрядні логічні операції широко застосовують для швидкого виділення залишку від ділення операндів типу unsigned int на значення, кратні двом, а також для визначення значення одного або декількох заданих бітів числа.
Наприклад, визначення залишку від ділення операнда unsigned int на 2, 4, 8, 16 і т. Д. Вимагає поразрядной логічної операції І діленого відповідно з масками 0х01, 0х03, 0х07, 0х0f, 0x1f і т. Д. Іншими словами, виділяються молодші біти числа, а інші біти встановлюються в 0. Це найбільш швидкий спосіб виділення залишку.
int s = 0x05, mask = 0x01;
r_or = smask = 0x05 0x01 = 0x01;
Це найбільш швидкий спосіб виділення залишку.
Мова С ++ включає дві операції порозрядного зсуву:
<<- сдвиг влево операнда слева от знака операции на число двоичных разрядов справа от знака операции;
>> - зсув вправо операнда зліва від знака операції на число двійкових розрядів праворуч від знака операції.
Висунуті біти втрачаються, а «вдвигаются» нульові біти.
Зрушення операндів вліво на 1, 2, 3 і більше розрядів - найбільш швидкий спосіб поділу на 2, 4, 8, ... Наприклад:
half_adr = adr >> 1; / * Розподіл на 2 * /
double_adr = adr <<1; /* умножение на 2*/
Часто операції зсуву виконуються при перетворенні чисел або при формуванні цілого з частин.
Обмеженням операції зсуву є те, що число двійкових розрядів для зсуву операнда зліва може бути поставлено лише константою або константним виразом, т. Е. Виразом, цілком складається з констант. Тому компілятор згенерує повідомлення про помилку в наступному випадку:
int var1, shift = 5;
var1 = var1 >> shift;