Лекція (4 г.) :
Тема: Початкові відомості про мову C++. Алфавіт, базові типи і опис даних
План:
Імена в Сі++
Змінні в Сі++
Константи в Сі++
Вирази в Сі++
Операції порівняння і привласнення в Сі++
Арифметичні операції
Логічні операції
Імена в Сі++
Алфавіт
У алфавіт мови Сі++ входять:
• латинські букви: від а до z (рядкові) і від A до Z (прописні);
• десяткові цифри: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9;
• спеціальні символи: "{ }, I [ ] ( ) + - / % \; ' : ? < = > _ ! & # ~ ^ . *
До спеціальних символів відноситься також пробіл. У коментарях, рядках і символьних константах можуть використовуватися і інші знаки (наприклад, російські букви).
Комбінації деяких символів, не розділених пропусками, інтерпретуються як один значимий символ. До них відносяться:
++ — == && || «»>=<=+=-=*=/=?: /**///
У Сі++ в якості обмежувачів коментарів можуть використовуватися як пари символів /* і */, прийняті в мові Сі, так і символи //, використовувані тільки в Сі++. Ознакою кінця такого коментаря є невидимий символ переходу на новий рядок. Приклади:
/* Це коментар, допустимий в Сі і Сі++ */
// Це рядковий коментар, використовуваний тільки в Сі++
З символів алфавіту формуються лексеми — одиниці тексту програми, які при компіляції сприймаються як єдине ціле і не можуть бути розділені на дрібніші елементи. До лексем відносяться ідентифікатори, службові слова, константи, знаки операцій, роздільники.
Ідентифікатори. Послідовність латинських букв, цифр, символів підкреслення (_), що розпочинається з букви або символу підкреслення, є ідентифікатором. Наприклад:
В12 rus hard_RAM_disk MAX ris_32
На відміну від Паскаля в Сі/Сі++ розрізняються прописні і рядкові букви. Це означає, що, наприклад, flag, FLAG, Flag, FlAg — різні ідентифікатори.
Обмеження на довжину ідентифікатора можуть розрізнятися в різних реалізаціях мови. Компілятори фірми Borland дозволяють використовувати до 32 перших символів імені. У деяких інших реалізаціях допускаються ідентифікатори завдовжки не більше 8 символів.
С
лужбові
(ключові) слова.
Як і в Паскалі, службові слова в Сі — це
ідентифікатори, призначення яких
однозначно визначене в мові. Вони не
можуть бути використані як вільно
вибирані імена. Повний список службових
слів залежить від реалізації мови, т.
е. розрізняється для різних компіляторів.
Проте існує незмінне ядро, яке визначене
стандартом Сі++. Ось його список:
Додаткові до цього списку службові слова приведені в описах конкретних реалізацій Сі++. Деякі з них розпочинаються з символу підкреслення, наприклад: ^export, _ds, _AH та ін. Існують службові слова, що розпочинаються з подвійного підкреслення. У зв'язку з цим програмістові не рекомендується використовувати у своїй програмі ідентифікатори, що розпочинаються з одного або двох підкреслень, щоб уникнути збігу із службовими словами.
Концепція типів даних є найважливішою стороною будь-якої мови програмування. Особливість Паскаля полягає у великій різноманітності типів. Схема типів даних для мови Сі++ представлена на мал. 1.

Рис. 1
Порівняння схем призводить до висновку про те, що різноманітність типів даних в Сі++ менша, ніж в Турбо Паскале.
У Сі/Сі++ є чотири базові арифметичні (числових) типи даних. З них два цілочисельних — char, int — і два плаваючих (речових) — float і double. Крім того, в програмах можна використовувати деякі модифікації цих типів, що описуються за допомогою службових слів — модифікаторів. Існують два модифікатори розміру — short (короткий) і long (довгий) — і два модифікатори знаків — signed (знаковий) і unsigned (беззнаковий). Знакові модифікатори застосовуються тільки до цілих типів.
Як відомо, тип величини пов'язаний з її формою внутрішнього представлення, безліччю значень, що набувають, і безліччю операцій, застосованих до цієї величини. У таблиці. 1 перераховані арифметичні типи цих Сі++, вказаний об'єм займаної пам'яті і діапазон допустимих значень.
Розмір типу int і unsigned int залежить від розміру слова операційної системи, в якій працює компілятор Сі++. У 16-розрядних ОС (MS DOS) цим типам відповідають 2 байти, в 32-розрядних (Windows) — 4 байти.

Аналізуючи таблицю 1, можна зробити наступні висновки:
• якщо не вказаний базовий тип, то за умовчанням мається на увазі int;
• якщо не вказаний модифікатор знаків, то за умовчанням мається на увазі signed;
• з базовим типом float модифікатори не вживаються;
• модифікатор short застосований тільки до базового типу int. У відмінності від Паскаля, тип char зарахований до арифметичних типів. Адже навіть його ім'я вказує на те, що це символьний тип! У Сі/Сі++ величини типу char можуть розглядатися в програмі і як символи, і як цілі числа. Усе залежить від контексту, т. е. від способу використання цієї величини. У разі інтерпретації величини типу char як символу її числове значення являється ASCII -кодом. Наступний приклад ілюструє сказане.
char a = 6 5 ;
printf("%c", a);/*На екрані з'явиться символ А*/
printf("%d", a);/*На екрані з'явиться число 65*/
Символи "%c" є специфікацією формату введення/виведення символьних даних, а "%d" — специфікацією для цілих чисел.
Ще однією особливістю Сі, є відсутність серед базових типів логічного типу даних. Між тим, як ми далі побачимо, в Сі використовуються логічні операції і логічні вирази. В якості логічних величин в Сі/Сі++ виступають цілі числа. Інтерпретація їх значень в логічні величини відбувається за правилом: дорівнює нулю — брехня (у Паскале — false), не дорівнює нулю — істина (у Паскале — true).
У останні версії Сі++ доданий окремий логічний тип з ім'ям bool. Його відносять до різновиду цілих типів даних.
Опис змінних в програмах на Сі/Сі++ має вигляд:
Приклади описів :
char symbol, cc;
unsigned char code;
int number, row;
unsigned long long_number;
float x, X, cc3;
double e, b4;
long double max_num;
Одночасно з описом можна задати початкові значення змінних. Така дія називається ініціалізацією змінних. Опис з ініціалізацією проводиться за наступною схемою:
тип ім'я_змінної = початкове_значення
Наприклад:
float pi=3.14159, c=l.23;
unsigned int year=2000;
Константи.
Запис цілих констант.
Цілі десяткові числа, що розпочинаються не з нуля, наприклад: 4, 356, — 128.
Цілі вісімкові числа, запис яких розпочинається з нуля, наприклад: 016, 077.
Цілі шістнадцятиричні числа, запис яких розпочинається з символів 0х, наприклад: 0х1А, 0х253, 0xFFFF.
Тип константи компілятор визначає за наступними правилами: якщо значення константи лежить в діапазоні типу int, то вона отримує тип int; інакше перевіряється, чи лежить константа в діапазоні типу unsigned int, у разі позитивної відповіді вона отримує цей тип; якщо не підходить і він, то пробується тип long і, нарешті, unsigned long. Якщо значення числа не укладається в діапазон типу unsigned long, то виникає помилка компіляції.
Якщо в записі числової константи є присутньою десяткова точка (2.5) або експоненціальне розширення (1Е-8), то компілятор розглядає її як дійсне число і ставить їй у відповідність тип double. Приклади речових констант : 44. 3.14159 44ЕО 1.5Е-4.
Використання суфіксів. Програміст може явно задати тип константи, використовуючи для цього суфікси. Існують три види суфіксів :
F(f) - float
U(u) - unsigned;
L(l) - long (для цілих і речових констант). Крім того, допускається спільне використання суфіксів U і L у варіантах UL або LU.
Приклади:
3.14159F — константа типу float, під яку виділяється 4 байти пам'яті;
3.14L — константа типу long double, займає 10 байт;
50000U — константа типу unsigned int, займає 2 байти пам'яті (замість чотирьох без суфікса);
OLU — константа типу unsigned long, займає 4 байти;
24242424UL — константа типу unsigned long, займає 4 байти.
Запис символьних і строкових констант. Символьні константи полягають в апострофи. Наприклад: 'А', 'а', '5 '+'. Строкові константи, що є символьними послідовностями, полягають в подвійні лапки. Наприклад: "rezult", "введіть початкові дані".
Особливий різновид символьних констант представляють так звані символи, що управляють. Їх призначення — управління виводом на екран. Як відомо, такі символи розташовані в початковій частині кодової таблиці ASCII (коди від 0 до 31) і не мають графічного представлення. У програмі на Сі++ вони зображуються парою символів, перший з яких “\“. Ось деякі з символів, що управляють :
'\n' — перехід на новий рядок;
'\t' — горизонтальна табуляція;
'\а' — подача звукового сигналу.
Символьні послідовності, що управляють, є часним випадком эскейп-послідовностєй (ESC — sequence), за допомогою яких можна задати символьну константу вказівкою її коду. Код символу можна вказати у вісімковому або в шістнадцятиричному уявленні. Формат вісімкового представлення : ''. Тут d — вісімкова цифра (від 0 до 7). Формат шістнадцятиричного представлення : '' (чи ''), де h — шістнадцятирична цифра (від 0 до F). Наприклад, константа, що відповідає заголовній латинській букві А, може бути представлена трьома способами : 'А', '101 ', '\u1093?41'.
Іменовані константи (константні змінні). Як і в Паскале, в програмі на Сі/Сі++ можуть використовуватися іменовані константи. Вживане для їх визначення службове слово const прийнято називати кваліфікатором доступу. Кваліфікатор const вказує на те, що ця величина не може змінюватися впродовж усього часу роботи програми. Зокрема, вона не може розташовуватися в лівій частині оператора привласнення. Приклади опису константних змінних :
const float pi=3.14159;
const int iMIN=l, iMAX=1000;
Визначення констант на стадії препроцесорної обробки програми. Ще однією можливістю ввести іменовану константу являється використання препроцесорної директиви #define в наступному форматі:
#define <ім'я константи> <значення константи>
Наприклад:
#define iMIN I
#define iMAX 1000
Тип констант явно не вказується і визначається за формою запису. У кінці директиви не ставиться крапка з комою.
На стадії препроцесорної обробки вказані імена замінюються на відповідні значення. Наприклад, якщо в програмі є присутнім оператор
X=iMAX - iMIN;
те в результаті препроцесорної обробки він набере вигляду:
Х=1000-1;
При цьому ідентифікатори iMAX і iMIN не вимагають опису усередині програми.
Константи перераховуваного типу. Цей засіб мови дозволяє визначати послідовність цілочисельних іменованих констант. Опис перераховуваного типу розпочинається із службового слова enum, а подальший список констант полягає у фігурні дужки. Наприклад:
enum {A, B, C, D};
В результаті імені А буде зіставлена константа 0, імені В — константа l, C — 2, D — 3. За умовчанням значення першої константи дорівнює нулю.
Для будь-якої константи можна явно вказати значення. Наприклад:
enum {A=10, B, C, D};
В результаті будуть встановлені наступні відповідності: А = 10, B = 11, C = 12, D = 13.
Можливий і такий варіант визначення перерахування :
enum {А=10, В=20, З=35, D=100};
Якщо перераховуваному типу дати ім'я, то його можна використовувати в описі змінних. Цей варіант аналогічний використанню перераховуваного типу даних в Паскале. Наприклад:
enum metal {Fe, Co, Na, Cu, Zn);
metal Metl, Met2;
Тут ідентифікатор metal стає ім'ям типу. Після такого опису в програмі можливі наступні оператори:
Metl=Na; Met2=Zn;
У усіх мовах програмування під виразом мається на увазі конструкція, складена з констант, змінних, знаків операцій, функцій, дужок. Вираз визначає порядок обчислення деякого значення. Якщо це числове значення, то такий вираз називають арифметичним. Ось декілька прикладів арифметичних виразів, записаних за правилами мови Сі :
a+b 12.5 - z 2*(X+Y)
х++ х+++b --n*2 n*=1
Три перші вираження мають традиційну форму для мов програмування високого рівня, тому їх сенс очевидний. Наступні чотири вираження специфічні для мови Сі.
Опишемо набір операцій, використовуваних в Сі, а також правила запису і обчислення виразів. Нагадаємо, що операція, що застосовується до одного операнда, називається унарною, а операція з двома операндами — бінарною.
До арифметичних операцій відносяться:
— віднімання або унарний мінус;
+ складання або унарний плюс;
* множення;
/ ділення;
% ділення по модулю (аналог Mod в Паскале);
++ унарна операція збільшення на одиницю (інкремент);
-- унарна операція зменшення на одиницю (декремент).
Усі операції, окрім ділення по модулю, застосовані до будь-яких числових типів даних. Операція % застосована тільки до цілих чисел.
Розглянемо особливості виконання операції ділення. Якщо ділиме і дільник — цілі числа, то і результат — ціле число. В цьому випадку операція / діє аналогічно Div в Паскале. Наприклад, значення вираження 5/3 дорівнюватиме 2, а при обчисленні 1/5 вийде 0.
Якщо хоч би один з операндів має речовий тип, то і результат буде речовим. Наприклад, операції 5. / 3, 5. / 3., 5/3. дадуть речовий результат 1.6666.
Операції інкремента і декремента можуть застосовуватися тільки до змінних і не можуть — до констант і виразів. Операція ++ збільшує значення змінної на одиницю, операція — зменшує значення змінної на одиницю. Обидва знаки операції можуть записуватися як перед операндом (префіксна форма), так і після операнда (постфіксна форма), наприклад: ++X або X++, --а або а--. Три наступні оператори дають один і той же результат:
х=х+1; ++х; х++
Відмінність проявляється при використанні префіксною і постфіксною форм у виразах. Проілюструємо це на прикладах. Перший приклад:
а=3; b=2;
с=а++*b++;
В результаті виконання змінні отримають наступні значення: а=4, b=3, c=6.
Другий приклад:
а=3; b=2;
с=++а*++b;
Результати будуть такими: а = 4, b = 3, с = 12.
Пояснення наступне: при використанні постфіксної форми операції ++ і -- виконуються після того, як значення змінної було використане у вираженні, а префіксні операції — до використання. Тому в першому прикладі значення змінної з обчислювалося як твір 3 на 2, а в другому — як твір 4 на 3.
По убуванню старшинства арифметичні операції розташовані в наступному порядку:
++, --
— (унарний мінус)
*, /, %
+, -
Однакові за старшинством операції виконуються в порядку зліва направо. Як і в Паскалі, для зміни порядку виконання операцій у виразах можуть застосовуватися круглі дужки.