Студопедия.Орг Главная | Случайная страница | Контакты | Мы поможем в написании вашей работы!  
 

Оператори



ВСТУП

В останні десять років відбулися кардинальні зміни в мовних засобах системного програмування. Якщо до цього десятиліття мови типу Асемблера широко використовувалися при розробці операційних систем, компіляторів і пакетів програм, то з середини 90-х роках стали домінувати операційні системи Windows, Unix і Linux, основними| мовами системного програмування яких є мова C та її об’єктно – орієнтоване розширення - мова C++. Більше того, мова програмування C і виникла на початку 70-років минулого сторіччя як мова програмування операційної системи Unix. Слід також відмітити, що інтерфейс прикладного програмування (Application Programming Interface – API) для операційних систем Windows її користувачам надається фірмою Microsoft тільки в формі набору API-функцій на мові програмування C.

Машинно – орієнтована мова Асемблер в даний час використовується тільки для оптимізації функціонування невеликих критичних за часом виконання або специфічних для різних мікропроцесорів ділянок операційних систем і системних програм, таких як BIOS, залежних від пристроїв частин драйверів і т. ін. Можливо, найбільш серйозне застосування Асемблер знаходить при ретрансляції системних програм. Зокрема, операційні системи Windows в аварійних випадках автоматично виводять на Асемблері ретрансльовані тексти ділянок коду, на яких відбувся непоправний збій або зафіксована програмна помилка.

Практично всі основні| засоби, стилі і методи системного і прикладного програмування втілені в мові C++ [1], розробленій Бьєрном Страуструпом в 1983 році.

Мова C++ є мовою системного програмування, основні| характеристики якої є наступними:

- є розвитком (надмножиною) процедурно - орієнтованої мови C;

- підтримує абстракцію даних за допомогою класів;

- підтримує об'єктно-орієнтоване програмування;

- підтримує узагальнене програмування;

- забезпечує використання макросів у нестандартних ситуаціях;

- дає можливість робити асемблерні вставки в програмах.

Мова C++ - універсальна мова програмування, задумана так, щоб зробити програмування надійнішим для професійного програміста. За винятком другорядних деталей C++ є надмножиною класичної мови процедурного програмування C. Крім можливостей, які дає мова C, мова C++ надає гнучкі та ефективні засоби оголошення нових типів даних. Використовуючи оголошення нових типів, які точно відповідають концепціям задачі, програміст може розділити програму на частини, які більш легко програмуються, тестуються та експлуатуються. Такий метод побудови програм часто називають абстракцією даних. При використанні цього методу конкретні дані кожного з типів містяться в наборах об'єктів, типи яких оголошені користувачем раніше. Такі об'єкти прості і надійні у використанні навіть в тих ситуаціях, коли їх тип не можна встановити на стадії компіляції. Програмування із застосуванням таких об'єктів часто називають об'єктно-орієнтованим. При правильному використанні цей метод програмування дає коротші, простіші системні програми, які легше зрозуміти і проконтролювати їх роботу.

1 БАЗОВІ ЕЛЕМЕНТИ МОВИ СИСТЕМНОГО ПРОГРАМУВАННЯ

Програма на мові системного програмування C++є набором функцій, які викликають одна одну, і, можливо, оголошень загальнодоступних (глобальних) змінних, використовуваних функціями для обробки, обміну і зберігання даних.

У будь-якій самостійній програмі на C++ повинна бути головна функціяз ім'ям main. Саме з цієї функції, в якому б місці програми вона не знаходилася, починається виконання всієї програми.

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

#include <iostream>

using namespace std;

void show_title()

{

cout << "Заголовок: Мовні засоби системного програмування." <<’\n’;

}

void show_lesson()

{

cout << "Розділ 1: Базові елементи мови." <<’\n’;

}

void main()

{

show_title();

show_lesson();

}

Коли програма починає виконання з функції main(), вона спочатку викликає функцію show_title(), яка виводить повідомлення на екран, скориставшись стандартним потоком виводу cout, який був підключений до програми її першою директивою #include <iostream>. Після завершення функції show_title() програма викликає функцію show_lesson(), що також виводить повідомлення на екран. Після завершення функції show_lesson() програма завершується, оскільки в головній функції програми main() більше немає інструкцій.

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

1.1 Функції

Найпоширеніший спосіб завдання яких - небудь дій в мові програмування – це виклик функції, яка виконує такі дії.

Перш ніж функціяможе бути викликана на виконання, вона має бути визначена.

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

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

Наприклад, функціядобування квадратного кореня виглядає таким чином:

double sqrt(double arg)

{

// інструкції, що обчислюють квадратний корінь

}

Використання цієї функції:

void f()

{

double root2 =2*sqrt(2.0);

}

Звичайно функціязавершується виконанням інструкції return e, де е – вираз, значення якого повертається як результат роботи функції. Тип виразу повинен відповідати типу результату функції.

Якщо як тип результату функції задано ключове слово void, це означає, що функціянічого не повертає і інструкція return не повинна використовуватися.

1.2 Коментарі

У мові C++ коментарі в програму можна включати двома різними способами.

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

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

Звичайно в програмах на C++ перший спосіб оформлення використовується для багаторядкових коментарів, а другий – для коротких зауважень, наприклад:

/*

Це багаторядковий коментар.

Дана програма визначає

парність цілого.

*/

#include <iostream>

using namespace std;

int main()

{

int num; // це однорядковий коментар C++

// вводу числа

cout << "Введіть число, що перевіряється: ";

cin >> num;

// перевірка на парність

if((num%2)==0) cout << "Число парне. \n";

else cout << "Число непарне. \n";

return 0;

}

Однорядкові коментарі можна вкладати в багаторядкові:

/*

Це багаторядковий коментар,

всередину якого // вкладений однорядковий коментар.

Закінчення багаторядкового коментарю.

*/

1.3 Змінні і типи даних

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

Перед використанням в обчисленнях будь-яка змінна має бути оголошена. Основна| форма оголошення наступна:

type name;

Тут type задає тип змінної (об'єкту), а name – ім'я цієї змінної. Наприклад, інструкція:

int cm;

оголошує змінну з ім'ям cm, а також задає тип цієї змінної int - ціле число.

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

Ім'ям змінної, функції або іншим програмним ідентифікатором мови C++ може бути будь-яка комбінація букв (українського, латинського і російського алфавітів), цифр і символів підкреслення, що починається з букви або символу підкреслення. В іменах однакові букви у верхньому і нижньому регістрах розглядаються як різні букви.

Відразу після оголошення, подібного тому, яке приведено вище, змінна містить випадкове значення. Тому перед використанням значення змінної вона повинна бути ініціалізована при оголошенні або ж їй повинне бути заздалегідь присвоєне значення відповідного типу. Наприклад:

int а = 27; // ініціалізація змінної при оголошенні

cm = а; // присвоювання значення змінній

У C++ є багато вбудованих типів, основні| з яких перелічені нижче:

bool - логічний тип, змінна може містити значення true (істина) або false (хибність);

char - символьний тип, змінна може містити один алфавітно-цифровий або спеціальний символ;

int - тип цілих чисел;

float - тип чисел з плаваючою крапкою;

double - тип чисел з плаваючою крапкою подвоєної точності.

До оголошень цілих типів зліва можуть приписуватися один або два модифікатори: signed – значення зі знаком, unsigned – значення без знаку, short – коротке, long – довге ціле; при цьому саме оголошення int може опускатися. Модифікатор long також може використовуватися з числами з плаваючою крапкою типу double.

Логічні, символьні і цілі типи всі разом узагальнено називаються цілими (строго кажучи, інтегральними) типами. Цілі типи спільно з типами з плаваючою крапкою називаються арифметичними типами.

1.4 Вказівники і масиви

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

Наприклад:

char *cp; // вказівник на символ

int *iq; // вказівник на ціле

int (*fp)(int); // вказівник на функцію, аргументом

// яким є ціле число і яка

// повертає ціле число як результат

Перед використанням в програмі вказівник повинен містити адресу об'єкту потрібного типу. Перед присвоюванням вказівнику адреса змінної, елементу масиву, функції або іншого об'єкту може бути одержана за допомогою оператора узяття адреси (&), наприклад:

q = &cm; // вказівник містить адресу змінної inch

fp = &max; // вказівник містить адресу функції max

Оператор розіменування вказівника (*) використовується для доступу до значення об'єкту, що адресується вказівником, наприклад:

int i = *q; // змінна i містить 27 - значення cm

Масив – це набір даних одного типу, розміщених безперервно в оперативній пам'яті. Окрема одиниця даних, що входить в масив, називається елементом масиву. Масив оголошується зазначенням типу елементів масиву, його імені і розміру, наприклад:

char v[10]; // масив з 10 символів

int ia[5] = {10, 20, 30, 40, 50}; // масив цілих із значеннями,

// переліченими в списку після

// знаку "="

Для звернення до значення елементу масиву задається ім'я масиву і індекс потрібного елементу в квадратних дужках, наприклад: v[5], а[0].

У всіх масивів нижня межа – 0, тобто масив v[10] – це елементи: v[0], v[1]…,v[9].

Виходячи зі сказаного, визначення функції копіювання 10-ти елементів з одного масиву в іншій виглядатиме таким чином:

void copy_function()

{

int v1[10];

int v2[10];

for (int i = 0; i<10; ++i)

v1[i]= v2[i];

}

1.5 Літерали

Літералом називається послідовність символів, яка інтерпретується як безпосередньо задане значення одного з базових типів. У мові C++ літерал є одним з двох різновидів констант; другим різновидом є типовані |константи, які оголошуються як звичайні змінні, але з модифікатором const.

1.5.1 Логічні літерали

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

1.5.2 Символьні літерали

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

'f', 'a', 'я'|, '1'

Спеціальні та контролюючі символи мають в мові С++ стандартні імена, які починаються з символу зворотної косої риски (\) як escape – символу. Всі ці символи перелічені в табл. 1.1.

Таблиця 1.1

Спеціальні і контролюючі символи

Назва символу Позначення ASCII Запис на C++
Переведення рядка NL(LF) \n
Горизонтальна табуляція HT \t
Вертикальна табуляція VT \v
Повернення назад BS \b
Повернення каретки CR \r
Переведення сторінки FF \f
Сигнал BEL
Зворотна коса риска \ \
Знак запитання ? \?
Одиночні лапки ' \'
Подвійні лапки " \"
Нульовий символ NUL \0
Вісімкове число ooo \ooo
Шіснадцяткове число hhh \xhhh
Останні два рядки таблиці відображають той факт, що будь-який символ можна представити у вигляді вісімкового або шіснадцяткового числа.

1.5.3 Цілі літерали

Цілі літерали можуть представлятися десятковими, вісімковими або шіснадцятковими числами.

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

Вісімкове число завжди починається з цифри 0 і може містити тільки цифри 0 – 7, наприклад: 076 (62 в десятковому представленні).

Шіснадцяткове число завжди має префікс 0x або 0X і складається з комбінації цифр 0 – 9 і букв а – f або A – F, наприклад: 0x12 (18 в десятковому зображенні), 0XA3 (163 в десятковому зображенні).

Довгий цілий літерал явно визначається латинською буквою l або L, що стоїть після десяткового, вісімкового або шіснадцяткового числа, наприклад: 188l, 036L, 0x1B9l.

1.5.4 Літерали з плаваючою крапкою

За умовчанням літерали з плаваючою крапкою є числами типу double, наприклад:

345. (345 десяткове)

3.14159 (3.14159 десяткове)

.123e3 (123 десяткове)

4037E-5 (.04037 десяткове)

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

Якщо потрібен літерал типу float, його явно можна задати за допомогою суфікса f або F, наприклад:

345.0F

3.14159f

.123e3F

1.5.5 Рядкові літерали

Рядкові літерали представляються послідовністю символів, взятою в подвійні лапки. Наприклад:

"This is а character string"

"Це рядок символів."

"123456789"

Якщо рядковий літерал не вміщається в один рядок редактора інструментальної системи (наприклад, MS Visual Studio 7.1), він записується на декількох рядках, кожен з яких береться в подвійні лапки.

Хоча зовні рядковий літерал – це послідовність символів, взятих у лапки, при розміщенні його в пам'яті в кінець послідовності додається ще один службовий символ з нульовим кодом. Рядковий літерал має тип char[], тобто він розглядається як масив символів.

Вирази

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

x++ b = 10 x = (y*z)/w у = 2*sqrt(6.0)

Потрібно відмітити, що вираз, за яким слідує крапка з комою (;), є однією з інструкцій мови C++, які детально розглядатимуться в наступному розділі.

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

Послідовність (напрям) обчислення правого або лівого операндів для оператора також має значення. Якщо не враховувати цього, можуть бути отримані неправильні результати. Наприклад:

int inuml = 3;

int ianswer;

ianswer = (inuml = 4) + (inuml *2);

Інтуїтивно зрозуміло, що для оператора присвоювання (=) треба спочатку оцінити вираз в правій частині, а потім результат потрібно помістити за адресою, одержаною в результаті обчислення (якщо таке треба було робити) лівої частини. При виконанні оператора "+" також важливо, лівий або правий підвираз обчислювати першим. Якщо лівий, а потім правий – результат буде рівним 12 (4 + 4*2); якщо правий, а потім лівий – результат буде 10 (4 + 3*2). Напрям оцінки операндів перед виконанням оператора називається його асоціативністю; як правило, вона однозначно визначена для кожного оператора мовою і компілятором цієї мови.

При обчисленні виразів, включаючи вирази з операторами присвоювання, автоматично здійснюються осмислені приведення типів. Наприклад:

void some_function ()

{

// оголошення змінних і присвоювання початкових значень

double d = 2.2;

int i = 7;

// обчислення

d = d + i;

i = d * i;

}

Оператори

Всі оператори мови C++ у порядку зменшення пріоритетів їх виконання при обчисленні виразів приведені в табл. 1.2.

У таблиці оператори, що мають однакові пріоритети виконання, згруповані разом. Групи відокремлені одна від одної суцільними горизонтальними лініями; усередині групи оператори розділені пунктирними лініями. Групи розташовуються у порядку зменшення пріоритетів операторів, що містяться в них.

Напрям оцінки операндів для кожного оператора приведений в колонці 3. В колонці 4 таблиці приводяться варіанти використання кожного оператора. У цій колонці таблиці, як і в усій книзі, використані наступні позначення:

- name – довільне ім'я;

- class_name - ім'я класу;

- namespase_name - ім'я простору імен;

- qualified_name – кваліфіковане ім'я (послідовність простих імен, розділених крапкою);

- member – ім'я члена класу;

- object – вираз, результатом оцінки якого є об'єкт якогось класу;

- pointer - вираз, результатом оцінки якого є вказівник на об'єкт;

- pointer_to_member – вказівник на член класу;

- expr – деякий вираз, по типу відповідний даному оператору;

- expr_list – список виразів, розділених комою;

- lvalue – вираз, який після оцінки задає об'єкт, значення якого може бути змінено;

- type – ім'я типу.

Таблиця 1.2

Оператори мови C++, приведені по групам в порядку зменшення пріоритетів їх виконання

Оператор Виконувана операція Асоціативність Використання
() Круглі дужки, підвираз Зліва направо (expr)
:: Визначення області видимості для класів Справа наліво class_name::member
:: Визначення області видимості для простору імен Справа наліво namespace_name::member
:: Глобальне ім'я Справа наліво ::name
:: Глобальне кваліфіковане ім'я Справа наліво ::qualified_name
. Вибір члена структури або класу по імені об'єкту Зліва направо object.member
-> Вибір члена структури або класу через вказівник на об'єкт Зліва направо pointer->member
[] Доступ до елементу масиву по індексу Зліва направо pointer[expr]
() Виклик функції Зліва направо expr(expr_list)
() Ініціалізація члена класу Зліва направо member(expr)
++ Постфіксне збільшення Справа наліво lvalue++
-- Постфіксне зменшення Справа наліво lvalue--
typeid Ідентифікація типу. Повертає посилання на структуру type_info, визначену в бібліотеці <typeinfo> Справа наліво typeid(type)
typeid Ідентифікація типу виразу під час виконання. Повертає посилання на структуру type_info, визначену в бібліотеці <typeinfo> Справа наліво typeid(expr)
dynamic_cast Приведення типів з перевіркою під час виконання Справа наліво dynamic_cast<type>(expr)
static_cast Приведення споріднених типів (наприклад, тип з плаваючою крапкою в цілий тип) з перевіркою під час компіляції Справа наліво static_cast<type>(expr)
reinterpret_cast Приведення між не зв'язаними типами (наприклад, цілих у вказівники, одних вказівників в інші) без перевірки Справа наліво reinterpret_cast<type>(expr)
const_cast Константне приведення. Анулює дію модифікатора const Справа наліво const_cast<type>(expr)
sizeof Отримання розміру об'єкту Справа наліво sizeof expr
sizeof Отримання розміру типу Справа наліво sizeof(type)
++ Префіксне збільшення Справа наліво ++lvalue
-- Префіксне зменшення Справа наліво --lvalue
~ Побітове заперечення НЕ Справа наліво ~lvalue
! Логічне заперечення НЕ (not) Справа наліво !expr
- Унарний мінус Справа наліво -expr
+ Унарний плюс Справа наліво +expr
& Отримання адреси Справа наліво &lvalue
* Розіменування – непряме звернення до об'єкту через вказівник Справа наліво *expr
new Динамічне виділення пам'яті і створення об'єкту заданого типу Справа наліво new type
new[] Динамічне виділення пам'яті і створення масиву об'єктів заданого типу Справа наліво new type[expr]
delete Динамічне знищення об'єкту із звільненням пам'яті Справа наліво delete pointer
delete[] Динамічне знищення масиву об'єктів із звільненням пам'яті Справа наліво delete[] pointer
() Приведення виразу до заданого типу Справа наліво (type)expr
.* Вибір по імені об'єкту змінної або функції - члена класу непрямо через вказівник Зліва направо object.*pointer_to_member
->* Вибір через вказівник на об'єкт змінної або функції – члена класу непрямо через вказівник Зліва направо pointer->*pointer_ to_member
* Множення Зліва направо expr * expr
/ Ділення Зліва направо expr / expr
% Залишок від ділення Зліва направо expr % expr
+ Складання Зліва направо expr + expr
- Віднімання Зліва направо expr - expr
<< Переміщення вліво Зліва направо expr << expr
>> Переміщення вправо Зліва направо expr >> expr
<< Перевантажений оператор виводу в потік вводу - виводу Зліва направо cout << expr
>> Перевантажений оператор вводу з потоку вводу - виводу Зліва направо cin >> lvalue
< Менше Зліва направо expr < expr
<= Менше або рівно Зліва направо expr <= expr
> Більше Зліва направо expr > expr
>= Більше або рівно Зліва направо expr >= expr
== Рівно Зліва направо expr == expr
!= Не рівно Зліва направо expr!= expr
& Побітове І (AND) Зліва направо expr & expr
^ Побітове АБО (OR) без виключень Зліва направо expr ^ expr
| Побітове АБО Зліва направо expr | expr
&& Логічне І Зліва направо expr && expr
|| Логічне АБО Зліва направо expr || expr
= Просте присвоювання Справа наліво lvalue = expr
*= Множення з присвоюванням Справа наліво lvalue *= expr
/= Ділення з присвоюванням Справа наліво lvalue /= expr
%= Залишок від ділення з присвоюванням Справа наліво lvalue %= expr
+= Складання з присвоюванням Справа наліво lvalue += expr
-= Віднімання з присвоюванням Справа наліво lvalue -= expr
<<= Переміщення вліво з присвоюванням Справа наліво lvalue <<= expr
>>= Переміщення вправо з присвоюванням Справа наліво lvalue >>= expr
&= Побітове І з присвоюванням Справа наліво lvalue &= expr
|= Побітове АБО з присвоюванням Справа наліво lvalue |= expr
^= Побітове АБО без виключень з присвоюванням Справа наліво lvalue ^= expr
?: Умовний вираз Справа наліво expr?expr:expr
, Кома (послідовність) Зліва направо expr, expr
Як видно з таблиці, в мові C++ поряд з традиційними арифметичними і логічними операторами є ряд операторів, яких немає в інших мовах програмування. До цієї категорії відносяться побітові оператори, оператори збільшення і зменшення, оператор умовного виразу (поряд з умовними інструкціями), оператор "кома", оператори комбінованих присвоювань.

1.7.1 Оператори вводу – виводу

Оператори вводу (>>) і виводу (<<) не є вбудованими в мову C++, а забезпечуються стандартною бібліотекою за допомогою потоків вводу – виводу. При запуску програми на виконання автоматично відкриваються три стандартні потоки мови C++:

cin – стандартний потік вводу (з клавіатури);

cout – стандартний потік виводу (на дисплей);

cerr – стандартний потік для видачі повідомлень про помилки (на дисплей).

Для виконання операторів потокового вводу – виводу в програму повинна бути включена інструкція препроцесора:

#include <iostream>

Нижче будуть коротко описані потокові операції, що виконуються операторами вводу і виводу мови C++. Детальна інформація про систему вводу – виводу мови C, побудовану на основі бібліотечних функцій, міститься в кінці розділу 3. Детальному опису системи вводу – виводу мови C++ присвячений окремий, дев'ятий, розділ навчального посібника.





Дата публикования: 2014-11-03; Прочитано: 657 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!



studopedia.org - Студопедия.Орг - 2014-2024 год. Студопедия не является автором материалов, которые размещены. Но предоставляет возможность бесплатного использования (0.026 с)...