Вираз і його інтерпретація

Вирази в мові С ++ - це послідовність операндів, операцій і символів-роздільників. Операнди - це змінні, константи або інші вирази. Роздільниками в С ++ є символи [] () <>. ;. * = #, Кожен з яких виконує свою функцію. Вираз може складатися з однієї або більше операцій і визначати виконання цілого ряду елементарних кроків по перетворенню інформації. Компілятор дотримується суворий порядок інтерпретації виразів, званий правилами передування. Цей порядок може бути змінений, якщо окремі частини виразу укласти в круглі дужки. Елементарна операція по перетворенню інформації задається знаком операції. За кількістю операндів беруть участь в операції розрізняють дві групи операцій: унарні (один операнд) і бінарні (два операнда). За типом виконуваної операції розрізняють арифметичні, порозрядні, логічні, привласнення, операції відносини і ін.

Основні операції і їх пріоритет

Мова С ++ включає стандартний набір арифметичних операцій додавання (задається знаком +), віднімання (-), множення (*), ділення (/), які не потребують особливого пояснення. Специфічними для З ++ є операції визначення залишку (%), инкремента (++) і декремента (-). Операцію% пояснює наступний приклад:

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;

Схожі статті