Специфікатори класу пам'яті У C++ є чотири специфікатори класу пам'яті: auto, register, static, extern. Специфікатор класу пам'яті може передувати оголошенням змінних і функцій, вказуючи компілятору, як слід зберігати змінні в пам'яті і як діс-тавати доступ до змінних або функцій. Змінні, оголошені із специфікато-рами auto і register, є локальними, а із специфікаторами static і extern – глобальними. Пам'ять для локальної змінної виділяється кожного разу, досягнувши блоку, в якому оголошена змінна, і звільняється після закін-чення виконання блоку. Пам'ять для глобальної змінної виділяється один раз при запуску програми й звільняється, коли робота програми закін-чена. Вказані чотири специфікатори визначають також зону видимості змінних і функцій, тобто частину програми, в межах якої до іденти-фікатора можна звернутися по імені. На зону видимості змінної й функції впливає місце її оголошення в програмі. Якщо оголошення розташоване поза функцією, рівень оголошення є зовнішнім, якщо ж воно знаходиться в тілі функції – внутрішнім. Специфікатори класу пам'яті розрізняються за сенсом в залежності від того, що оголошується – змінна або функція, а також від того, на якому рівні, зовнішньому або внутрішньому, оголошується даний ідентифікатор. Змінна, оголошена на зовнішньому рівні, є глобальною і за замовчуванням має клас пам'яті extern. Зовнішнє оголошення може включати ініціалізацію (явну або неявну) або просто бути посиланням на змінну, що ініціалізувалася в іншому місці програми. Наприклад: static int iv; // за замовчуванням неявно присвоюється 0 static int iv=10; // явне присвоюється int ir=20; // явне присвоюється Зона видимості глобальної змінної розповсюджується до кінця програми. Звернення до змінної не може знаходитися вище за той рядок, в якому вона оголошена. Змінна оголошується на зовнішньому рівні тільки один раз. Якщо в одному з файлів створена змінна з класом пам'яті static, то вона може бути оголошена під тим же ім'ям з тим же специфікатором static в будь-якому іншому початковому файлі. Оскільки статичні змінні доступні тільки в межах свого файлу, конфліктів імен не виникне. За допомогою специфікатора extern можна оголосити змінну, яка буде доступна з будь-якого місця програми. Це може бути посилання на змінну, описану в іншому файлі або нижче в тому ж файлі. Остання особливість робить можливим розміщення посилань на змінну до її ініціалізації. Операції C++ включає побітові операції, операції інкрементування й декре-ментування, умовну операцію, операцію кома, операції комбінованого присвоєння. Побітові операції працюють із змінними як із наборами бітів, а не як із числами. Ці операції використовуються в тих випадках, коли необхідно дістати доступ до окремих біт даних (при виведенні графічних зображень на екран). Побітові операції застосовуються тільки до цілочисельних значень. На відміну від логічних операцій, з їх допомогою порівнюються не два числа цілком, а окремі їх біти. Основні побітові операції: І (&), АБО (|) і що виключає АБО (^). Сюди можна також зарахувати унарну операцію побітового заперечення (~), яка інвертує значення бітів числа. Операція & записує в біт результату одиницю тільки в тому випадку, якщо обидва порівнюваних біта дорівнюють 1, як показано в такій таблиці: Ця операція часто використовується для маскування окремих бітів числа. Наприклад: 0xF1 & 0x 35 = 0x 31. Операція | записує в біт результату одиницю в тому випадку, якщо хоч би один з порівнюваних бітів дорівнює 1, як показано в такій таблиці: Ця операція часто застосовується для установки окремих бітів числа. Наприклад: 0x F1 | 0x 35 = 0x F5. Операція ^ записує в біт результату одиницю в тому випадку, якщо порівнювані біти відрізняються один від одного, як показано в такій таблиці: Ця операція часто застосовується при виведенні зображень на екран, коли відбувається накладення декількох графічних шарів. Наприклад: 0x F1 ^ 0x 35 = 0x C4. У C++ існує дві операції зсуву: << - зсув ліворуч, >> - зсув праворуч. Дія першої операції полягає в зсуві бітового представлення цілочисельної змінної, вказаної зліва від операції, ліворуч на кількість бітів, задану праворуч від операції. При цьому звільнені молодші біти заповнюються нулями, а відповідна кількість старших бітів втрачається. Зсув беззнакового числа на одну позицію ліворуч із заповненням молодшого розряду нулем еквівалентне множенню числа на 2. Наприклад: unsigned int iv=65; // молодший байт: 01000001 iv<<=1; // молодший байт: 10000010 cout<<iv; // буде виведене 130 Зсув праворуч супроводжується аналогічними діями, тільки бітове представлення числа зрушується на вказану кількість бітів управо. Значення молодших бітів втрачаються, а старші біти, що звільнилися, заповнюються нулями, якщо операнд беззнаковий, і значенням знакового біта інакше. Таким чином, зсув беззнакового числа на одну позицію праворуч еквівалентне діленню числа на два: unsigned int iv=10; // молодший байт: 00001010 iv>>=1; // молодший байт: 00000101 cout<<iv; // буде виведене 5 Збільшення (зменшення) значення змінної на 1 дуже часто зустрі-чається в програмах, тому розробники мови С++ передбачили для цих цілей спеціальні операції інкрементування (++) і декрементування (--). Так, замість рядка iv+1, можна ввести рядок iv++ або ++iv. За ситуації, коли операція ++ є єдиною у виразі, не має значення місце її розташування: до імені змінної або після нього. Значення змінної в будь-якому випадку збільшиться на одиницю. У процесі роботи з складними виразами необхідно уважно стежити, коли саме відбувається модифікація змінної. Потрібно розрізняти префіксні й постфіксні операції, які ставляться відповідно до або після імені змінної. Наприклад, при постфіксному інкрементуванні i++ спочатку повертається значення змінної, після чого воно збільшується на одиницю. З іншого боку, операція префіксного інкрементування ++i вказує, що спочатку слід збільшити значення змінної, а потім повернути його як результат. Наприклад: k=++ i; // i=4, k=4 k=i++; // i=4, k=3 k=--i; // i=2, k=2 k=i--; // i=2, k=3 У C++ представлені всі стандартні арифметичні операції: складання (+), віднімання (–), множення (*), ділення (*/) і ділення по модулю (%). Перші чотири операції не вимагають роз'яснень. Суть операції ділення по модулю: int ia=3, ib=8, id; id=ib % ia; // результат: 2. При діленні по модулю повертається залишок від операції цілочисельного ділення. У C++ операція привласнення (=) може входити до складу інших виразів. У результаті виконання операції привласнення повертається значення, привласнене лівому операнду. Наприклад, такий вираз цілком коректний: iv=8*(iw=5); //iv=40. У даному випадку спочатку змінній iw присвоюється значення 5, після чого це значення помножується на 8, а результат присвоюється змінній iv. Комбіновані операції присвоєння наведені у табл. 2. Таблиця 2 |