Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
+ООП_Навч_посібник.doc
Скачиваний:
7
Добавлен:
01.07.2025
Размер:
6.58 Mб
Скачать

3.1.3. Глобальні змінні

Щоб наділити змінну "всепрограмною" популярністю, її необхідно зробити глобальною. На відміну від локальних, глобальні змінні зберігають свої значення протягом всього часу життя (часу існування) програми. Щоби створити глобальну змінну, її необхідно оголосити поза всіма функціями. Доступ до глобальної змінної можна отримати з будь-якої функції.

Глобальні змінні відомі всій програмі.

У наведеному нижче коді програми змінна pm оголошується поза всіма функціями. Її оголошення передує функції main(). Але її з таким самим успіхом можна розмістити у іншому місці, головне, щоб вона не належала якій-небудь іншій функції. Пам'ятайте: оскільки змінну необхідно оголосити до її використання, глобальні змінні краще за все оголошувати на початку програми.

Код програми 3.2. Демонстрація механізму використання глобальних змінних

#include <iostream> // Для потокового введення-виведення

using namespace std; // Використання стандартного простору імен

void fun_c1();

void fun_c2();

int pm; // Це глобальна змінна.

int main()

{

int i; // Це локальна змінна.

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

pm = i * 2;

fun_c1();

}

getch(); return 0;

}

void fun_c1()

{

cout << "pm: " << pm; // Звернення до глобальної змінної.

cout << "\n"; // Виведення символу нового рядка.

fun_c2();

}

void fun_c2()

{

int pm; // Це локальна змінна.

for(pm=0; pm<3; pm++) cout << '.';

}

Незважаючи на те, що змінна pm не оголошується ні у функції main(), ні у функції fun_c1(), обидві вони можуть її використовувати. Але у функції fun_c2() оголошується локальна змінна pm. Тут під час звернення до змінної pm здійснюється доступ до локальної, а не до глобальної змінної. Важливо пам'ятати: якщо глобальна і локальна змінні мають однакові імена, то всі посилання на суперечливе ім'я змінної усередині функції, у якій визначена локальна змінна, належать локальній, а не глобальній змінній.

3.2. Модифікатори типів даних

У мові програмування C++ перед такими типами даних, як char, int і double, дозволяється використовувати модифікатори. Модифікатор слугує для зміни значення базового типу, щоб він точніше відповідав конкретній ситуації. Перерахуємо можливі модифікатори типів:

signed, unsigned, long, short

Модифікатори signed, unsigned, long і short можна застосовувати до цілочисельних базових типів. Окрім того, модифікатори signed і unsigned можна використовувати з типом char, а модифікатор long – з типом double. Всі допустимі комбінації базових типів і модифікаторів для 16- і 32-розрядних середовищ наведено в табл. 3.2 і 3.3. У цих таблицях також вказано типи і розміри значень в бітах і діапазони представлення для кожного типу. Безумовно, реальні діапазони, що підтримуються Вашим компілятором, необхідно уточнити у відповідній документації.

Вивчаючи ці таблиці, звернемо Вашу увагу на кількість бітів, що виділяються для зберігання коротких, довгих і звичайних цілочисельних значень. Зауважте: у більшості 16-розрядних середовищ розмір (у бітах) звичайного цілочисельного значення збігається з розміром короткого цілого. Також зверніть увагу на те, що в більшості 32-розрядних середовищ розмір (у бітах) звичайного цілочисельного значення збігається з розміром довгого цілого. "Собака заритий" в С++-визначенні базових типів. Згідно з стандартом мови програмування C++, розмір довгого цілого повинен бути не меншим за розмір звичайного цілочисельного значення, а розмір звичайного цілочисельного значення повинен бути не меншим від розміру короткого цілого. Розмір звичайного цілочисельного значення повинен залежати від середовища виконання. Це означає, що в 16-розрядних середовищах для зберігання значень типу int використовується 16 біт, а в 32-розрядних – 32. При цьому найменший допустимий розмір для цілочисельних значень в будь-якому середовищі повинен становити 16 біт. Оскільки стандарт мови програмування C++ визначає тільки відносні вимоги до розміру цілочисельних типів, то немає гарантії, що один тип буде більший (за кількістю бітів), ніж інший. Проте розміри, вказані в обох таблицях, справедливі для багатьох компіляторів.

Табл. 3.2. Всі допустимі комбінації базових типів і модифікаторів для 16-розрядного середовища

Тип

Розмір в бітах

Діапазон

char

8

-128  +127

unsigned char

8

0  +255

signed char

8

-128  +127

int

16

-32 768  +32 767

unsigned int

16

0  +65 535

signed int

16

Аналогічний типу int

short int

16

Аналогічний типу int

unsigned short int

16

Аналогічний типу unsigned int

signed short int

16

Аналогічний типу short int

long int

32

-2 147 483 648  +2 147 483 647

signed long int

32

Аналогічний типу long int

unsigned long int

32

0  +4 294 967 295

float

32

3,4E-38  3,4E+38

double

64

1,7E-308  1,7E+308

long double

80

3,4E-4932  1,1E+4932

Незважаючи на дозвіл мови С++, використання модифікатора signed для цілочисельних типів є надлишковим, оскільки оголошення за замовчуванням передбачає значення зі знаком. Строго кажучи, тільки конкретна реалізація визначає, яким буде char-оголошення: зі знаком чи без нього. Але для більшості компіляторів під оголошенням типу char розуміють значення зі знаком. Таким чином, у таких середовищах використання модифікатора signed або char-оголошення також є надлишковим. У цьому навчальному посібнику вважається, що char-значення мають знак.

Табл. 3.3. Всі допустимі комбінації базових типів і модифікаторів для 32-розрядного середовища

Тип

Розмір в бітах

Діапазон

char

8

-128  +127

unsigned char

8

0  +255

signed char

8

-128  +127

int

32

-2 147 483 648  +2 147 483 647

unsigned int

32

0  +4 294 967 295

signed int

32

Аналогічний типу int

short int

16

-32 768  +32 767

unsigned short int

16

0  +65 535

signed short int

16

-32 768  +32 767

long int

32

-2 147 483 648  +2 147 483 647

signed long int

32

Аналогічний типу signed int

unsigned long int

32

Аналогічний типу unsigned int

float

32

3,4Е-38  3,4Е+38

double

64

1,7Е-308  1,7Е+308

long double

80

3,4Е-4932  1,1Е+4932

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

Цілочисельні значення із знаком ("+" чи "-") використовуються в багатьох алгоритмах, але максимальне число, яке можна представити із знаком, становить тільки половину від максимального числа, яке можна представити без знаку. Розглянемо, наприклад, максимально можливе 16-розрядне ціле число (32 767):

01111111 11111111

Якби старший розряд цього значення із знаком дорівнював 1, то воно б інтерпретувалося як -1 (у додатковому коді). Але, якщо оголосити його як unsigned int-значення, то після встановлення його старшого розряду в +1 ми отримали б число 65 535.

Щоб зрозуміти відмінність в С++-інтерпретації цілочисельних значень із знаком і без нього, виконаємо таку коротку програму.

Код програми 3.3. Демонстрація відмінності між signed- і unsigned-значеннями цілочисельного типу

#include <iostream> // Для потокового введення-виведення

using namespace std; // Використання стандартного простору імен

int main()

{

short int izm; // Коротке int-значення із|із| знаком

short unsigned int jzm; // Коротке int-значення без знаку

jzm = 60000;

izm = jzm;

cout << izm << " " << jzm;

getch(); return 0;

}

У процесі виконання програма виведе два числа:

-5536 60000

Йдеться про те, що бітова комбінація, яка представляє число 60000 як коротке цілочисельне значення без знаку, інтерпретується як коротке int-значення із знаком як число -5536.

У мові програмування C++ передбачено скорочений спосіб оголошення unsigned-, short- і long-значень цілочисельного типу. Це означає, що під час оголошення int-значень достатньо використовувати слова unsigned, short і long, не вказуючи тип int, тобто тип int мається на увазі. Наприклад, такі дві настанови оголошують цілочисельні змінні без знаку:

unsigned x; unsigned int y|в,біля|;

Змінні типу char можна використовувати не тільки для зберігання ASCII-символів, але і для зберігання числових значень. Змінні типу char можуть містити "невеликі" цілі числа в діапазоні -128  +127 і тому їх можна використовувати замість int-змінних, якщо Вас влаштовує такий діапазон представлення чисел. Наприклад, у наведеному нижче коді програми char-змінну використовують для керування циклом, який виводить на екран алфавіт англійської мови.

Код програми 3.4. Демонстрація можливості виведення алфавіту в зворотному порядку

#include <iostream> // Для потокового введення-виведення

using namespace std; // Використання стандартного простору імен

int main()

{

char letter;

for(letter = 'z'; letter >= 'A'; letter--) cout << letter;

getch(); return 0;

}

Якщо цикл for у наведеному прикладі здається дещо дивним, то врахуйте, що символ 'А' представляється в комп'ютері як число, а значення від 'z ' до 'А' є послідовними і розташовані в спадному порядку.