Знаки операцій, роздільники, коментарі 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Знаки операцій, роздільники, коментарі



ЗМІСТ

1.  Базові елементи мови програмування С++. 3

1.1.     Склад мови. 3

1.2.     Алфавіт мови. 3

1.3.     Лексеми. 4

1.4.     Ключові слова. 4

1.5.     Ідентифікатори. 5

1.6.     Константи. 5

1.7.     Символьні рядки. 5

1.8.     Знаки операцій, роздільники, коментарі 6

2.  Типи даних. 7

2.1.     Класифікація типів даних. 7

2.2.     Цілочислові типи. 8

2.3.     Дійсні типи. 9

2.4.     Оголошення змінних і констант. 9

2.5.     Переліки. 10

3.  Структура програми.. 11

3.1.     Функція main. 11

3.2.     Область дії змінної 11

3.3.     Введення і виведення даних. 12

3.4.     Функції стандартної математичної бібліотеки. 13

4.  Вирази і операції 14

4.1.     Поняття виразу, операнда, операції 14

4.2.     Порядок виконання операцій. 16

4.3.     Арифметичні операції 16

4.4.     Порозрядні операції 17

4.5.     Операції порівняння. 18

4.6.     Логічні операції 18

4.7.     Операції присвоєння. 19

4.8.     Умовна операція. 22

4.9.     Операція визначення розміру sizeof. 22

4.10.  Узгодження типів у виразах. 23

5.  Умовні оператори.. 24

5.1.     Оператори. 24

5.2.     Умовний оператор if. 25

5.3.     Оператор вибору switch. 27

6.  Оператори циклу. 30

6.1.     Цикл з параметром. Оператор for. 30

6.2.     Цикл з передумовою. Оператор while. 35

6.3.     Цикл з постумовою. Оператор do while. 38

6.4.     Оператори переходу. 39

6.5.     Використання псевдовипадкових чисел. 41

7.  Масиви.. 42

7.1.     Властивості масивів в мові програмування С++. 42

7.2.     Одновимірні масиви. 42

7.3.     Багатовимірні масиви. 47

7.4.     Символьні рядки. 49

8.  Вказівники.. 50

8.1.     Оголошення вказівника, операції, пов’язані з вказівниками. 50

8.2.     Адресна арифметика. 52

8.3.     void – вказівники, типізація вказівників. 54

8.4.     Звертання до елементів масивів через вказівники. 55

8.5.     Масиви символьних рядків і масиви вказівників. 59

8.6.     Динамічне виділення пам’яті 62

9.  Структури і об’єднання.. 63

9.1.     Оголошення і ініціалізація структур. 63

9.2.     Звертання до елементів структур. 68

9.3.     Перейменування типів. 71

9.4.     Об’єднання. 72

9.5.     Поля бітів. 74

10. Директиви препроцесора.. 77

10.1.  Призначення директив препроцесора. 77

10.2.  Директива включення #include. 77

10.3.  Директиви макропідстановок #define i #undef. 77

10.4.  Директиви умовної компіляції 80

10.5.  Директиви #ifdef, #ifndef. 81

11. Функції 83

11.1.  Структура функції 83

11.2.  Виклик функцій. Прототипи функцій. 85

11.3.  Взаємодія фактичних і формальних параметрів функцій. 86

11.4.  inline – функції 88

11.5.  Масиви і символьні рядки як параметри функцій. 89

11.6.  Використання кваліфікатора const в оголошеннях параметрів. 92

11.7.  Багатовимірні масиви як параметри функцій. 93

11.8.  Опрацювання структур у функціях. 94

11.9.  Вказівники на функції 96

11.10. Рекурсивні функції 97

12. Класи пам'яті даних. 99

12.1.  Клас пам'яті, час існування і видимість об’єкта. 99

12.2.  Область дії глобальних і локальних змінних. 100

12.3.  Специфікатори класів пам'яті 102

12.4.  Специфікатори глобальних змінних. 103

12.5.  Багатофайлові програми. 104

13. Робота з файлами.. 105

13.1.  Звертання до файлів. 105

13.2.  Послідовний запис до файлу і послідовне читання з файлу. 106

13.3.  Файли з довільним доступом.. 108

 


1. Базові елементи мови програмування С++

Склад мови

У будь-якій мові можна виділити чотири основні елемента: символи, слова, словосполучення і речення. Такі самі елементи містить і алгоритмічна мова, тільки слова називають лексемами (елементарними конструкціями), словосполучення – виразами, речення – операторами. Лексеми складаються з символів, вирази – з лексем і символів, оператори – з символів, виразів і лексем (мал. 1.1). Лексеми утворюють з символів, вирази – з символів і лексем, оператори – з символів, лексем і виразів.

 

Мал. 1.1. Елементи мови програмування і зв’язок між ними

 

Алфавіт мови (символи мови) – це основні неподільні знаки, за допомогою яких пишуть всі тексти цією мовою. Лексема, або елементарна конструкція – мінімальна одиниця мови, яка має самостійне значення. Вираз задає правило обчислення певного значення. Оператор визначає повний опис певної дії. Оператори можна поділити на дві групи. Оператори першої групи виконують дії над даними, оператори другої групи використовуються для визначення даних.

Кожен елемент мови програмування визначається через його синтаксис та семантику. Синтаксичні визначення встановлюють правила побудови елементів мови програмування, семантика визначає їх зміст і правила використання. Об'єднана єдиним алгоритмом сукупність описів і операторів утворює програму на алгоритмічній мові. Для виконання програми її необхідно перетворити до виду, який може зрозуміти процесор, тобто у машинні коди. Цей процес називається компіляцією.

Алфавіт мови

Алфавіт мови програмування визначає набір символів, які можуть використовуватися для формування лексичних елементів програм. Всі символи алфавіту С++ можна поділити на три групи. До першої групи входять символи ключових слів і ідентифікаторів, до яких належать великі та малі літери латинської абетки, цифри, знак підкреслення. До другої групи входять символи, що використовуються як знаки операцій, символи пунктуації та роздільники:

 

+ - * / % = < > & |! ~ ^?,.;: ‘ “ () [ ] { } # \

 

Третя група символів – це так звані неграфічні символи, кожен з яких має встановлений внутрішній код, як і символи першої і другої групи, але не має власного графічного позначення. До цієї групи належать символ пробілу та спеціальні керуючі символи, які ще називають ескейп-послідовностями: символ табуляції, нового рядка, нової сторінки тощо. Пробільні неграфічні символи використовуються для відокремлення лексем.

В оперативній пам'яті комп’ютера кожен символ зберігається як ціле двійкове число, значення якого відповідає коду цього символу. Найбільш поширеною системою кодування символів є таблиця ASCII – кодів (скорочення від American Standard Code for Information Interchange – американський стандартизований код для обміну інформацією). Згідно з цією системою кодування код символу є однобайтовим, що дає змогу занести в повну ASCII – таблицю 256 символів з кодами від 0 до 255.

Властивості кодування символів у ASCII – таблиці, що мають практичне застосування у програмуванні багатьох задач: коди символів цифр 0…9 розташовані послідовно у порядку зростання: 48…57; коди великих латинських літер A…Z і малих літер a…z записані послідовно в абетковому порядку, великі літери: 65…90, малі: 97…122; різниця кодів малих і відповідних великих латинських літер однакова і дорівнює 32.

Спеціальні керуючі символи (керуючі послідовності, ескейп – послідовності) позначають неграфічні символи, призначені для керування формою виведення даних і повідомлень. Їх можна записувати трьома способами: використовуючи символьну форму, вісімкове чи шістнадцяткове позначення. У всіх трьох варіантах запису першим символом послідовності є зворотна коса риска (лівий слеш, \).

У символьній формі ескейп – послідовності за рискою записується визначена для даного символу літера. Вісімкове позначення ескейп – послідовності складається з риски та однієї, двох або трьох вісімкових цифр (цифри від 0 до 7), що задають код даного символу. Шістнадцяткова форма ескейп – послідовності починається символами \х або \Х, за якими вказуються одна або дві шістнадцяткові цифри (цифри 0…9 або літери a…f або A…F). Так, для горизонтальної табуляції використовується ескейп – послідовність \t, ASCII код 9, \011 або \09, для переходу на новий рядок - \n, код 10 або \012 чи \х0а.

Як ескейп – послідовності записують також вказані нижче символи абетки, коли вони використовуються як окремі символьні константи або як елементи символьних рядків: \’ – позначення апострофа, \” – позначення лапок, \\ - позначення лівого слеша, \? позначення знака запитання. При використанні цих символів відсутність слеша може викликати неправильну інтерпретацію символьних рядків.

Через вісімкову та шістнадцяткову форму ескейп – послідовності можна записати довільний символ ASCII таблиці. Наприклад, ескейп – послідовність \0 позначає символ з кодом 0, тобто перший символ ASCII таблиці. Цей символ використовується у символьних рядках як ознака кінця рядка. Незважаючи на те, що в записах ескейп – послідвностей використовується два, три або чотири символи, вони позначають один символ стандартної кодової таблиці і розглядаються компілятором нарівні з іншими символами мови.

Лексеми

Найменшими змістовними елементами програми, що мають самостійне призначення, є лексичні одиниці (лексеми). Лексеми мови С++ поділяють на 6 груп: ключові слова, ідентифікатори, константи, символьні рядки, знаки операцій та роздільники.

Ключові слова

Ключові (службові, зарезервовані) слова – це набір визначених слів, що використовуються для встановлення типів даних, класів пам'яті даних, формування операторів тощо. Кожне ключове слово має своє призначення, застосовувати ключові слова для іншої мети (зокрема як імена змінних і функцій) заборонено. Перелік ключових слів:

 

asm auto     break case catch

char class    const continue default

do double   else enum extern

float for      friend goto if

inline int      long new operator

private protected public register return

short signed   sizeof static struct

switch template this throw try

typedef typeid   union unsigned virtual

void volatile while

 

В ключових словах великі і малі літери вважаються різними. Тому їх треба записувати так, як вони вказані вище, наприклад, int, а не Int або INT. Int і INT не є ключовими словами, але їх не варто використовувати в якості імен змінних або функцій.

Ідентифікатори

Імена змінних, макросів, меток, функцій та інших об’єктів програми називають ідентифікаторами. Ідентифікатори формують з символів першої групи, тобто з малих і великих латинських літер, цифр і знака підкреслення. Ідентифікатор не може починатися з цифри. В ідентифікаторах розрізняються великі та малі літери, тому а і А вважаються двома різними ідентифікаторами.

Константи

Константи (літерали) – це об’єкти програми, значення яких змінювати не можна. Константи належать до арифметичних даних. Стандарт мови поділяє константи на цілочислові, дійсні, символьні та перелікові.

Цілочислові константи використовуються для позначення цілих чисел зі знаком або без знака. Можуть бути записані у десятковій, вісімковій або шістнадцятковій формі. Вісімкові константи завжди починаються цифрою 0, за якою записують вісімкові цифри значення константи (від 0 до 7). Шістнадцяткові константи починаються префіксом 0х або 0Х, за яким вказують шістнадцяткові цифри числа (цифри 0…9, літери a…f, A…F). Наприклад, число 12 можна записати як 014 (вісімкова форма) або 0хС (шістнадцяткова форма).

Дійсні константи застосовують для позначення чисел, які мають як цілу, так і дробову частину, тобто дійсних чисел. Дійсні константи можна записувати у двох форматах: з фіксованою і плаваючою крапкою. Константи з фіксованою крапкою містять цілу і дробову частини числа, які відокремлені одна від одної крапкою. У константах з плаваючою крапкою додатково вказується десятковий порядок числа, який записується після літери е або Е (від експонента). Наприклад, константа 2.3е-4 відповідає дійсному числу 2,3 × 10-4.

Символьні константи використовуються у програмі для звернення до окремих символів. Символьна константа позначається одним символом, записаним у апострофах або ескейп – послідовністю, теж записаною у апострофах. У символьних константах можна використовувати всі символи активної кодової таблиці. Наприклад, ‘a0’, ‘\n’, ‘\’’, ‘\xA1’.

Символьні рядки

Символьні рядки (рядкові константи) – це послідовність довільних символів кодової таблиці, охоплена лапками. Наприклад, “Hello, world”. Символьні рядки можуть містити ескейп – послідовності: “Hello, \”world\””.

В оперативній пам'яті всі символи рядка розташовані підряд. Кожен символ, включаючи ескейп – послідовності, займає один байт, в якому записується код символу. Особливість використання символьних рядків в мови програмування С++ полягає в тому, що компілятор автоматично долучає до них кінцевий нуль-символ \0, який використовується в процесі опрацювання рядків як ознака їх кінця.

Таким чином, два записи ‘А’ і “А” будуть різними не тільки синтаксично (по формі запису), а й семантично (за змістом). Перший запис позначає символьну константу, яка зберігається у пам'яті як ціле число, значення якого дорівнює коду літери А. Другий запис є символьним рядком, що складається з двох символів: літери А і нуль – символа.

Довжина символьного рядка не обмежується. У разі наявності в програмі довгих рядкових констант може виникнути потреба їх запису у декількох рядках програми. Використовують два способи поділу символьних рядків.

Перший полягає в тому, що в місці розриву рядка записують лівий слеш, за яким ставлять символ нового рядка (натискають клавішу Enter). Записані в наступному рядку символи вважають продовженням строкової константи. Недолік цього способу в тому, що в рядок результату потрапляють всі символи пробілу, записані перед символом слеша на початку нового рядка.

У другому способі перенесення строкових констант використовується така властивість компілятора: він об’єднує (конкатенує) у спільний рядок два записані підряд рядки, при цьому між ними може бути довільна символів – роздільників: пробілів, символів нового рядка, табуляції. Тому довгий рядок можна просто поділити на частини.

 

“Приклад довгого символьного рядка \ // Перший варіант

з перенесенням”

“Приклад довгого символьного рядка ” // Другий варіант

“з перенесенням”

 

Типи даних

Класифікація типів даних

Кожна одиниця даних програми, тобто кожна змінна і кожна константа, має певний тип. Тип даних визначає обсяг оперативної пам'яті, яка буде виділена для збереження даних цього типу; діапазон допустимих значень, які можуть набувати змінна або константа цього типу; набір операцій, які можна виконувати над змінною або константою цього типу. Тип змінних завжди вказуються явно при їх описах, тип констант встановлюється компілятором автоматично за формою запису константи в програмі.

Типи даних С++ можна поділити на три групи: 1) скалярні, або прості – в довільний момент часу можуть мати лише одне значення; 2) агреговані, або складені – формуються за встановленими правилами з наборів скалярних типів; 3) тип «функція», що оголошує функції з заданим складом параметрів і встановленим типом значення, яке повертає функція. Арифметичні типи даних можна поділити ще на дві групи: 1) цілочислові, змінні цих типів можуть набувати тільки цілих значень; 2) дійсні – дозволяють зберігати і обробляти дійсні числа. Класифікація типів даних С++ показана на мал. 2.1.

Крім цього, типи даних можна поділити на базові і похідні. Базовими є типи int, char, float, double а також типи, утворені з них через застосування модифікаторів short, long, signed, unsigned. Особливим базовим типом є тип void – порожній або невизначений тип, який використовується, зокрема, в оголошеннях функції. Похідними вважають вказівникові типи, агреговані типи і функції. Всі вони формуються з використанням базових типів.

 

Мал. 2.1. Класифікація типів даних С++

 

Цілочислові типи

Основним типом даних, який використовується при роботі з цілими числами, є тип int (від англ. integer – ціле число). До типу int можна застосовувати модифікатори long (довге ціле), short (коротке ціле). Діапазони допустимих значень цілих типів даних компілятора Microsoft Visual Studio 2010 наведені в таблиці 2.1. Для інших компіляторів розмір в байтах та діапазон значень може відрізнятися.

Тип int ті його модифікації є знаковими типами – один біт (здебільшого найстаршій) двійкового коду числа займає знак. Прийнято, що знак плюс позначається нулем, знак мінус – одиницею. За замовчуванням змінні є знаковими (позначені необов’язковим модифікатором signed). Якщо певні дані набувають лише додатних значень, то можна вдвічі збільшити діапазон допустимих значень змінних оголосивши їх з модифікатором unsigned (беззнаковий). У беззнакових змінних біт знака розглядається як звичайний біт даних. Модифікатор unsigned можна використовувати разом з модифікаторами long і short.

 

Таблиця 2.1. Діапазони допустимих значень цілих типів

Тип Розмір в байтах Діапазон значень
int 4 -2 147 483 648 … 2 147 483 648
short int 2 32 768 … 32 767
unsigned short int 2 0 … 65 565
long int 4 -2 147 483 648 … 2 147 483 648
unsigned long int 4 0 … 4 294 967 295
long long int 8 -263 … 263-1
unsigned long long int 8 0 … 264-1
char 1 -128 … 127
unsigned char 1 0 … 255

 

Цілочислові константи можна записувати в трьох формах – десятковій, вісімковій, шістнадцітковій (див. розділ 1.6). Тип цілочислової константи встановлюється за її значенням і формою запису по таким правилам: 1) якщо значення константи потрапляє в діапазон значень типу int, то така константа отримує тип int; 2) інакше, якщо це беззнакова вісімкова чи шистнадцяткова константа, яка потрапляє в діапазон значень типу unsigned int, їй присвоюється тип unsigned int; 3) інакше, якщо значення константи потрапляє в діапазон значень типу long int, то ця константа отримує тип long int; 4) інакше, якщо константа беззнакова і потрапляє в діапазон значень типу unsigned long int, вона отримує цей тип; 5) інакше фіксується помилка.

Можна модифікувати тип константи. Для цього до числа долучають кінцеві символи u (або U) та l (або L). Символ u/U вказує, що константі має бути присвоєний модифікатор unsigned, символ l/L розширює константу до розміру типу long int. Можна поєднувати обидва символи модифікації типу в довільному порядку. Наприклад, 0x1bd83ul – константа отримає тип unsigned long int.

Мова С++ відносить тип даних char (від англ. character – літера) до цілочислових типів. Через це тип даних char сумісний з усіма арифметичними типами.

До цілочислових констант належать також символьні константи. Символьна константа – це довільний, допустимий для встановленої на комп’ютері кодової таблиці графічний символ або ескейп-послідовність, записані в апострофах. Значенням символьної константи є числове значення коду символу. Саме код символу бере участь у всіх операціях, в які ступає символьна константа. Одну за значенням символьну константу можна записати декількома способами: ‘*’ – символьне зображення, ‘\052’ – вісімкова ескейп-послідовність, ‘\Х2А’ – шістнадцяткова ескейп-послідовність.

Логічний тип даних теж належить до цілих типів. Змінні цього типу можуть набувати два значення – true, false. В якості логічних змінних можна також використовувати змінні будь-якого цілочислового типу. При цьому нульове значення відповідає значенню false, будь-яке ненульове – значенню true.

В заголовному файлі limits записано набір макроконстант (іменованих констант), значення яких дорівнюють мінімальним і максимальним значенням, встановленим для цілих типів у даній системі програмування. Макроконстанти деяких граничних цілочислових значень наведені в таблиці 2.2.

 

Таблиця 2.2. Макроконстанти деяких граничних цілочислових значень

Ім’я макроконстанти Значення макроконстанти
CHAR_MIN, CHAR_MAX Найменше і найбільше значення даних з типом char
SCHAR_MIN, SCHAR_MAX Найменше і найбільше значення даних з типом signed char
INT_MIN, INT_MAX Діапазон значень даних з типом int
SHRT_MIN, SHRT_MAX Діапазон значень даних з типом short int
LONG_MIN, LONG_MAX Діапазон значень даних з типом long int
LLONG_MAX Діапазон значень даних з типом long long int

 

Дійсні типи

Для збереження і опрацювання дійсних чисел, тобто чисел, що складаються з цілої та дробової частини, в С++ використовуються типи даних float, double, long double. Відповідно до стандарту С++, тип float повинен мати точність не менше 6-ти значущих десяткових цифр, типи double, long double – не менше 10 значущих десяткових цифр. Діапазон значень трьох дійсних типів згідно зі стандартом повинен бути не меншим, ніж від 10-37 до 1037.

Для запису дійсних констант використовують дві форми запису – з фіксованою та плаваючою крапкою (див. розділ 1.6). Незалежно від форми запису дійсна константа зберігається в пам'яті як число в форматі double. Тип дійсної константи можна модифікувати, долучивши до неї кінцеву літеру f (або F) для встановлення типу float, або літеру l (або L) для встановлення типу long double.

В заголовному файлі float.h записані макроконстанти, які характеризують параметри всіх трьох дійсних типів.

Переліки

Перелікові типи, або просто переліки – це набори цілочислових констант, кожна з яких має унікальне в межах програми ім’я. Переліки оголошують таким чином:

 

enum ім’я_переліку {список_іменованих_констант};

 

тут ім’я переліку – ім’я, яке визначає (ідентифікує) даний перелік; список іменованих констант – набір імен, які надаються константам переліку. Тег переліку та імена його констант повинні відповідати правилам запису ідентифікаторів. Переліки є зручним способом для створення груп іменованих констант. Їх використання дозволяє підвищити наочність програм, спрощує внесення змін і доповнень, полегшує процес налагодження програм.

Наступний перелік надає імена константам, які позначають дні тижня:

 

enum days {Mon, Tue, Wed, Thu, Fri, Sat, Sun};

 

Кожен елемент переліку є константою з типом int, йому присвоюється значення, на одиницю більше,ніж значення попереднього елемента. Стандартно першій елемент переліку отримує значення нуль. Тобто, константа Mon з переліку days дорівнює 0, константа Tue дорівнює 1, константа Wed дорівнює 2 і так далі. Стандартні значення констант можна змінити, присвоївши їм потрібні цілочислові значення:

 

enum work_days {MON=1, TUE, WED, THU, FRI};

 

Перший елемент переліку в цьому випадку отримає значення 1, другий 2, і так далі.

Константні значення можна присвоїти всім або декільком елементам переліку:

 

enum RGBColors {Red = 1, Green = 128, Blue = 255};

enum Colors {RED = 1, GREEN, BLUE = 5};

 

Можна оголошувати змінні, які будуть мати визначений переліків тип. Наприклад, після оголошення

 

enum days {Mon, Tue, Wed, Thu, Fri, Sat, Sun};

enum days d1;

 

змінна d1 може набувати значення кожної з констант переліку days. Змінні переліскового типу можна оголошувати окремо, як у попередньому прикладі, і разом з оголошенням переліку:

 

enum days {Mon, Tue, Wed, Thu, Fri, Sat, Sun} d1, d2, d3;

 

Структура програми

Функція main

Найкоротша програма, яку можна написати мовою програмування С++, компіляція якої не викличе помилок, і яка, зрозуміло, не буде виконувати корисних дій, має такий вигляд:

 

int main(){}

 

При структурному підході до написання програм їх основною складовою частиною є функція. Функція – це синтаксично і логічно завершений самостійний фрагмент програми, що має власне ім’я і реалізує певну задачу. У програмах мовою С++ використовуються два види функцій – бібліотечні, які створені розробниками компілятору і зберігаються в бібліотеці системи програмування, і користувацькі функції, які створює програміст у даній програмі. Окремим типом функції є функція main. Вона обов’язково має бути присутньою у програмі, і саме з цієї функції починається виконання програми, її закінчення викликає завершення роботи всієї програми. Функцію main називають точкою входу в програму.

Всі функції С++ мають однакову структуру:

 

тип_значення_функції ім’я_функції (список_параметрів) {

тіло_функції

}

 

Початкова частина функції, яка складається з типу значень функції, імені функції і списку оголошень параметрів функції, записаного в круглих дужках, називається заголовком функції. Тіло функції охоплюється фігурними дужками і формується з описів даних і операторів, що реалізують дії, які повинна виконувати дана функція.

Відповідно до стандарту, функція main має повертати значення типу int. Список параметрів для неї можна залишати порожнім, в фігурних дужках записують описи змінних і оператори програми.

Область дії змінної

Область дії змінної залежить від того, в якому місці програми вона оголошена. Оголошення змінних можна записати:

1) поза межами всіх функцій – це глобальна змінна, яку можна використовувати у будь якому місці програми, починаючи від точки її оголошення, глобальні змінні автоматично ініціалізуються нульовими значеннями;

2) всередині функцій або програмних блоків – такі змінні називають локальними, область дії локальної змінної обмежена функцією чи програмним блоком, в якому оголошено дану змінну;

3) в списку формальних параметрів функцій – локальні змінні, діють в межах функції.

Наприклад, виконуємо програму:

 

#include <iostream>

using namespace std;

int a;                      // Глобальна змінні

int main(){

int b;                 // Локальна змінна

cout << "a=" << a << endl; // Виводить 0

cout << "b=" << b << endl; // Попередження, випадкове

// число

}

 

Змінна а глобальна, їй автоматично буде присвоєне значення 0. При спробі вивести значення змінної b на екран компілятор видасть попередження – змінна не була ініціалізована. При ігноруванні цього попередження на екрані з’явиться випадкове число.

В наступному прикладі змінна оголошена всередині блоку операторів:

 

#include <iostream>

using namespace std;

int a;

int main(){ // Початок блоку операторів 1

int b = 123;

{ // Початок блоку операторів 2

    int c = 456;       // Змінна с створена

    cout << "a=" << a << endl;

    cout << "b=" << b << endl;

    cout << "c=" << c << endl;

} // Кінець блоку операторів 2, змінна с знищена

cout << "a=" << a << endl;

cout << "b=" << b << endl;

cout << "c=" << c << endl; // Помилка, змінної с

                            // не існує

}     // Кінець блоку операторів 1

 

В цьому прикладі а – глобальна змінна, b і c – локальні змінні. Змінна а доступна в будь якому місці програми, час її життя співпадає з часом виконання програми. Змінні, оголошені всередині блоку операторів, існують з моменту оголошення і до завершення виконання операторів цього блоку. Тобто, змінна доступна у блоці, в якому вона оголошена, і у всіх вкладених в цей блок блоках.

У програмі два блока операторів, блок 2 вкладений в блок 1. У блоці 2 доступні всі змінні програми. Після закінчення виконання цього блоку будуть знищені всі змінні, які в ньому оголошені. В нашому випадку це змінна с. Тому, коли ми будемо намагатися вивести на екран значення змінної с другий раз, виникне помилка – такої змінної на цей час існувати не буде.

Введення і виведення даних

Будь-яка програма на С++ містить звертання до стандартної бібліотеки, в якій знаходяться визначення типів, констант, макросів, функцій і класів. Для їх використання в програмі необхідно підключити заголовні файли. Для цього використовується директива препроцесора include, після якої в кутових дужках записують ім’я файлу, який містить необхідні визначення.

Для виводу інформації на екран і для введення інформації з клавіатури ми будемо використовувати потоки – це абстрактне поняття, яке відноситься до будь якого переносу даних від їх джерела до одержувача.

Для використання потоків вводу – виводу необхідно підключити до програми заголовний файл iostream і вибрати простір імен за допомогою запису using namespace std;. Після цього можна використовувати такі потоки: cin потік, зв’язаний з клавіатурою, cout – потік, зв’язаний з екраном.

Для потоків cin i cout визначені такі операції: >> - читання з потоку, << - запис у потік. Їх використовують наступним чином:

 

#include <iostream>

using namespace std;

int main(){

int i;

cout << "i=";

cin >> i;

cout << "You entered " << i << "\nThank you" << endl;

}

 

Вирази і операції

Порядок виконання операцій

Порядок обчислення значення виразу базується на таких правилах:

1) з двох сусідніх операцій першою буде виконана та, пріоритет якої вищий;

2) операції однакового пріоритету виконуються зліва направо або з права наліво залежно від асоціативності, встановленої для даної групи операцій (табл. 4.1);

3) порядок виконання операцій можна змінити за допомогою круглих дужок – вираз у дужках обчислюється першим і розглядається як операнд зовнішньої операції.

Стандарт мови програмування С++ не встановлює порядку звертання до операндів в процесі виконання операції. Тобто, у виразі

 

w = (a + b) * (a - b);

 

операцію множення гарантовано буде виконано перед операцією присвоєння і після обчислення значень виразів у дужках. Але який з двох операндів – виразів (a+b) чи (a-b) буде обчислений першим – не визначено. В деяких випадках значення виразу залежить від порядку звертання до операторів. Наприклад

 

d = c + twice(&c);

 

Функція twice вдвічі збільшує значення змінної, адреса якої передана їй в якості параметра, і повертає нове значення. Нехай початкове значення змінної с дорівнює 5. Тоді значення виразу, що буде присвоєний змінній d, може дорівнювати 5+10=15, якщо першим буде вибраний лівий операнд, а потім – правий; або 10+10=20, якщо спочатку обчислюється правий операнд, тобто відбувається виклик функції, яка змінює значення с. Необхідно уникати виразів, результати обчислення яких можуть бути неоднозначними.

Арифметичні операції

До арифметичних належать такі операції (згідно з порядком старшинства операції):

1) -      (зміна знака операнда, унарна операція);

2) * / % (множення, ділення, остача від ділення, бінарні операції);

3) + - (додавання, віднімання, бінарні операції).

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

 

#include <iostream>

#include <cmath>

using namespace std;

int main(){

int a = 7, b = 3;  // 7 = 3 * 2 + 1

cout << a / b << endl; // 2

cout << a % b << endl; // 1

cout << (double)a / b << endl; // 2.3333

}

 

Порозрядні операції

Порозрядні операції (їх ще називають побітовими чи просто бітовими) виконуються тільки над операндами цілих типів. До них належать (згідно з порядком старшинства операції):

1) ~ (побітова інверсія, унарна операція);

2) <<        (зсування вліво), >> (всування вправо);

3) & (побітове AND);

4) ^ (побітове XOR);

5) | (побітове OR).

Використання порозрядних операцій дає змогу оперувати окремими бітами даних, перевіряти або змінювати їх значення, що наближає програмування мовою С++ до можливостей асемблера.

Порозрядні операції виконуються окремо над кожною парою бітів, що записані в однакових за номером розрядах двох операндів, які вступають в порозрядну операцію. Таблиця істинності порозрядних операцій наведена в табл. 4.2.

 

Таблиця 4.2. Таблиця істинності порозрядних операцій

Розряди

Результат операції

ai bi AND XOR OR
0 0 0 0 0
0 1 0 1 1
1 0 0 1 1
1 1 1 0 1

 

Операцію & називають накладанням маски, оскільки вона дає змогу виділити потрібні розряди цілочислового операнда. Наприклад, необхідно визначити значення першого біту числа. В масці в першому біті записуємо одиницю, в інших бітах – нуль. При виконанні операції & значення першого біту буде збережено, значення всіх інших – замінені на нуль.

Операцію | можна використовувати для встановлення одиниці в потрібних розрядах числових даних. Для цього в масці встановлюємо одиницю в позиціях, де її необхідно встановити, і нулі в позиціях, значення в яких необхідно залишити незмінними.

Операції << i >> зсувають усі розряди цілочислового операнда, заданого зліва від знака операції, на кількість бітів, вказану справа від знака операції.

У разі зсування вліво старші біти, які виходять за межі розрядної сітки числа, втрачаються, а на місце молодших бітів, що звільняються після зсування, заносять нулі. При зсуванні вправо втрачаються молодші розряди числа, які зсуваються за межі розрядної сітки. Заповнення звільнених старших розрядів залежить від типу даного: якщо операнд без знаковий (оголошений з модифікатором unsigned), то вільні старші розряди заповнюються нулями. Якщо праворуч зсувається знакове число, то для заповнення вільних розрядів використовується біт знака.

Проілюструємо використання побітових операцій такою програмою:

 

#include <iostream>

using namespace std;

 

void print_bin(unsigned char x) {

unsigned char mask = 1 << 7;

while (mask) {

    cout << (x & mask? 1: 0);

    mask >>= 1;

}

cout << endl;

}

 

int main(){

unsigned char a = 240;

unsigned char b = 170;

cout << "a "; print_bin(a);  // 11110000

cout << "b "; print_bin(b);  // 10101010

cout << "a & b "; print_bin(a & b); // 10100000

cout << "a | b "; print_bin(a | b); // 11111010

cout << "a ^ b "; print_bin(a ^ b); // 01011010

cout << "~a "; print_bin(~a); // 00001111

}

 

Операції порівняння

Операції порівняння (ще їх називають операціями відношення) є бінарними. Результатом виконання операцій є величина логічного типу – true або false. До операцій порівняння відносять:

1) > більше;

2) >= не менше;

3) < менше;

4) <= не більше;

5) == дорівнює;

6)!= не дорівнює.

Поширеною помилкою є використання знаку присвоєння = замість знака рівності ==. Оскільки присвоєння це також операція, що повертає присвоєне значення, компілятор може не фіксувати помилку в таких виразах, але часто видає попередження.

Логічні операції

В мові програмування С++ застосовуються три логічні операції:

1)!      логічне заперечення, унарна операція;

2) && логічне І, бінарна операція;

3) ||     логічне АБО, бінарна операція.

Операндами логічних операцій є логічні дані – істина (true) і хибність (false). Результатом логічної операції є величина логічного типу. Операндами також можуть бути числові дані: будь яке не нульове значення – це істина, нуль – хибність. Цей підхід використовується в мові програмування С, в якій немає логічного типу даних bool.

Операція логічного заперечення змінює логічне значення на протилежне. Тобто,

 

#include <iostream>

using namespace std;

int main(){

bool a = true;

cout << a << endl; // 1

cout <<!a << endl; // 0

}

 

Результат бінарної операції && буде істинним (не буде дорівнювати нулю), тільки в тому разі, коли обидва операнди є істинними (не дорівнюють нулю). Результат виконання операції || буде істинним, коли істинним є хоча б один з операндів.

Логічні вирази в С++ не обов’язково мають бути обчислені повністю. Як тільки значення виразу стає однозначним, подальші обчислення припиняються. При цьому, лівий операнд логічної операції обчислюється першим, а правий – другим. Це дає можливість записувати вирази, в яких одразу виконується зміна даних і перевірка. В деяких випадках це може призводити до некоректної роботи програми. Наприклад:

 

1 #include <iostream>

2 using namespace std;

3 int main(){

4 int a1 = 0, b1 = 1, c1 = 2;

5 int a2 = 0, b2 = 1, c2 = 2;

6 bool r;

7 r = b1 < c1 && ++a1 > 0;    // r = true

8 cout << "a1 = " << a1 << endl; // a = 1

9 r = b2 > c2 && ++a2 > 0;    // r = false



Поделиться:


Последнее изменение этой страницы: 2021-12-15; просмотров: 85; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.218.55.14 (0.221 с.)