Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
консплекС++1к 2013.doc
Скачиваний:
0
Добавлен:
01.04.2025
Размер:
667.14 Кб
Скачать

Лекція 4. Прості типи

План лекції (2 години)

  1. Стандартні типи даних

  2. Кваліфікатори const та volatile

  3. Перетворення типів

  4. Типи даних Windows

Прості типи

Всі програми обробляють деяку інформацію. У мовах С/С++ дані представляються одним з вісьми базових типів: char(текстові дані), int (цілі числа), float(числа з плаваючою комою одинарної точності, застосовуються лише для узгодження з попередніми версіями компілятора С), double(числа з плаваючою комою подвійної точності), void(порожні значення), boolean(логічні значення), переліки та вказівники. Розглянемо вказані типи.

  • Текст (тип даних char) – це послідовність символів, таких як a, Z, Y, які можуть відокремлюватися пробілами. Кожному символу відводиться 8 бітів, тобто 1 байт, з діапазоном значень від 0 до 255 (використовується для узгодження з попередніми версіями)

  • Цілі числа (тип даних short) знаходяться у діапазоні від -32768 до 32767 та розташовуються у 16 бітах, тобто 2 байтах або одному машинному слові(використовується для узгодження з попередніми версіями); int, 32-розрядні цілі, з діапазоном значень від -2147483648 до 2147483647

  • Числа з плаваючою комою одинарної точності (тип даних float) можуть відтворюватися як у фіксованому форматі, наприклад число Рі(3.14159), так і в експоненційному (7.5631*10-3 ). Діапазон значень від -3.4Е-38 до +3.4Е+38, вимірність – 32 біти, тобто 4 байти, або 2 машинних слова(використовується для узгодження з попередніми версіями).

  • Числа з плаваючою комою подвійної точності (тип даних double) мають діапазон значень від – 1.7Е-308 до +1.7Е+308 і вимірність 64 біти, тобто 8 байтів, або 4 машинних слова. Раніше існував тип long double з вимірністю 80 бітів та діапазоном від -1.18Е-4932 до +1.18Е+4932. В нових 32-розрядних версіях компіляторів він еквівалентний типу double та підтримується для узгодження зворотної сумісності з написаними раніше додатками.

  • Переліки являють собою набір іменованих констант різних типів

  • Тип даних void застосовується у функціях, які не повертають ніякого значення. Цей тип даних також можна використати для створення узагальнених вказівників.

  • Вказівники, на відміну від змінних інших типів, не містять даних у звичайному розумінні цього слова. Замість цього вказівники містять адреси пам’яті, де зберігаються дані.

  • Змінні типу boolean у С++ можуть містити лише одну з двох констант true або false.

В С++ підтримуються три типи цілих чисел. Поряд зі стандартним типом int існують типи shortint(коротке ціле) та longint(довге ціле). Дозволяються скорочення записів short та long. Не дивлячись на те, що синтаксис мови не залежить від використаної платформи, вимірність типів даних short, int та long може змінюватись. Гарантується лише те, що співвідношення вимірностей буде таким: short<=int<=long. У Mіcrosoft Visual C/C++ для змінних типу short резервується 2 байти, для типів int та long – 4 байти.

Компілятори мов С/С++ дають змогу при оголошенні змінних деяких типів вказувати модифікатор unsigned. Застосовується він з чотирьома типами даних: char, short, int та long. Наявність даного модифікатора вказує на те, що значення змінної повинне інтерпретуватися як беззнакове число, тобто найстарший біт є бітом даних, а не бітом знаку.

Нехай ми створили новий тип даних, my_octal, у якому для запису кожного числа відводиться 3 біти. За замовчуванням вважається, що значення цього типу можуть бути як додатніми, так і від’ємними. Оскільки з 3-х доступних бітів старший буде вказувати на наявність знаку, тому діапазон можливих значень буде від -4 до 3.

Але коли при оголошенні змінної типу my_octal вказати модифікатор unsigned, тоді звільнюється перший біт для зберігання корисної інформації і отримаємо діапазон можливих значень від 0 до 7. Подібні перетворення виконуються і для стандартних типів даних:.

Тип даних

Байтів

Еквівалентні назви

Діапазон значень

int

2/4

signed, signed int

залежить від системи

unsigned int

2/4

unsigned

залежить від системи

_int8

1

char, signed char

від -128 до 127

_int16

2

short, short int, signed short int

від -32768 до 32767

_int32

4

signed, signed int

від -214783648 до 214783647

int64

8

немає

від-9223372036854775808 до 9223372036854775807

char

1

signed char

від -128 до127

unsigned char

1

немає

від 0 до 255

short

2

short int, signed short int

від -32768 до 32767

unsigned short

2

unsigned short int

від 0 до65535

long

4

long int, signed long int

від -214783648до 214783647

unsigned long

4

unsigned long int

від 0 до 4284967295

1enura

немає

те ж саме, що int

float

4

немає

приблизно +/-3.4E+/-38

double

8

long double

приблизно +/- 1.8E+/-308

Модифікатори signed та unsigned можна використовувати з довільними цілочисловими типами даних. Тип char за замовчуванням інтерпретується як знаковий. Типи даних int та unsigned мають вимірність системного слова: 2 байти в MS DOS та 16 –розрядних версіях Windows і 4 байти у 32-розрядних операційних системах. При побудові програм, які можна переносити на інші комп’ютери, не потрібно покладатися на конкретну вимірність цілочислових типів. В той же час у компіляторі Microsoft C/C++ підтримується використання цілих чисел фіксованої вимірності, для чого введені типи _intX. У табл..3 показані всі можливі комбінації типів даних та модифікаторів signed та unsigned.

Повна назва

Еквіваленти

signed char

char

signed int

signed, int

signed short int

short, signed short

signed long int

long, signed long

unsigned char

немає

unsigned int

unsigned

unsigned short int

unsigned short

unsigned long int

unsigned long

Числа з плаваючою комою

В С/С++ застосовується три типи даних з плаваючою комою: float, double та long double. В Microsoft Visual C/C++ можливості типів даних з плаваючою комою значно перевищують мінімальні вимоги. Тип long double еквівалентний типу double.

Переліки

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

Наприклад: air_supply { EMPTY, USEABLE, FULL=5} instructor_tank;

Всі константи мають тип int, і кожній з них автоматично надається значення за замовчуванням, коли не вказане деяке інше значення. У даному прикладі константі EMPTY за замовчуванням надано нульове значення, оскільки це перший елемент у списку. Константі USEABLE надане значення 1, тому що це – другий елемент списку після константи зі значенням 0. Для константи FULL замість значення за замовчуванням призначене значення 5. Якщо за константою FULL записати ще константу, тоді її дорівнювало б 6.

Маючи перелік air_supply, оголосимо ще одну змінну - student_tank:

air_supply student_tank;

Обидві змінні тепер можна застосовувати незалежно одна від одної:

instructor_tank= FULL; student_tank=EMPTY ;

У цьому прикладі змінній instructor_tank надається значення 5, а змінній student_tank – 0.

У С++ при оголошенні змінної типу переліку немає потреби вказувати ключове слово enum, проте його наявність не є помилкою.

air_supply- це особливий тип даних, який можна застосовувати при створенні змінних, таких як instructor_tank та student_tank.

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

У мові С тип enum еквівалентний типу int. Тому можна надавати цілочислові значення змінним типу переліку. У С++ ведеться суворий контроль за типами даних, і такі присвоювання не допускаються.

Тип даних boolean

Тип даних boolean відноситься до сімейства цілих типів. Такі змінні можуть набувати тільки значення true чи false. В С++ всі умовні вирази повертають логічне значення. Наприклад, вираз myvar!=0, повертатиме true чи false залежно від значення змінної myvar.

Значення true та false поєднані один з одним наступними відношеннями:

!false==true а !true==false

Кваліфікатори

У С та С++ застосовуються два кваліфікатори доступу: const та volatile. Вони використовуються для позначення змінних, значення яких не можна змінювати (const), та змінних, значення яких можна змінювати у довільну мить (volatile).

const

Іноді вимагається залишати значення змінної постійним під час роботи програми. Такі змінні називаються константами. Наприклад, якщо у програмі обчислюється довжина кола чи площа кругу, тоді часто застосовується число Рі=3.14159. Оскільки число Рі все ж може змінювати надане йому значення, тобто може додаватися точність, тому зручно буде писати його як змінну, значення якої залишається постійним під час роботи програми.

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

Якщо у програмі використовується число Рі, тоді можна оголосити змінну з іменем Рі та надати їй значення 3.14159. Але воно не повинне більше змінюватись, оскільки це порушить правильність обчислень з числом Рі, тому потрібно формально повідомити про заборону розміщувати дану змінну у лівій частині оператора присвоювання. Це робиться використанням кваліфікатора const. Наприклад:

const float Hs=3.14159;

const int iMIN=1, iSALE_PERCENTAGE=25;

Оскільки значення константної змінної не може змінюватися у програмі, тому таку змінну можна тільки ініціювати. Це виконується при оголошенні змінної. Константні та прості змінні використовуються у програмі однаково. Єдина відмінність полягає у тому, що початкові значення, надані константним змінним при їх ініціюванні, не можуть змінюватися під час виконання програми. Іншими словами, константи не є L-значеннями (лівосторонніми значеннями), тобто не можуть розташовуватись у виразах зліва від оператора присвоювання. Прикладом L-значення, що посилається на комірку пам’яті, яку можна змінювати, є змінна, в оголошенні якої не вказаний кваліфікатор const. При виконанні присвоювання оператор записує значення правого операнда у комірку пам’яті, адресовану іменем лівого операнда. Таким чином, лівий операнд (або єдиний операнд унарної операції) повинен посилатися на змінювану комірку.

volatile

Ключове слово volatile вказує на те, що дана змінна у довільну мить може змінюватися при виконанні зовнішніх дій, які не контролюються програмою. Наприклад, наступний рядок оголошує змінну event_time, значення якої може змінюватися з відома програми: volatile int event_time;(у запису перше слово означає кваліфікатор, друге – тип змінної, третє – ім’я –мінної).

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

Кваліфікатор volatile також застосовується при оголошенні об’єктів даних, сумісно застосовуваних різними процесами у багатозадачному середовищі.

Одночасне використання кваліфікаторів const та volatile

Допускається одночасне використання ключових слів const та volatile при оголошенні змінних. Наприклад, у наступному рядку створюється змінна, яка поновлюється зовні, але значення якої не можна змінити власне програмою:

const volatile constant_event_time;

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

Перетворення типів даних

Часто при програмуванні в операціях використовуються змінні не однакового типу даних, а різних типів. такі операції називаються змішаними і в С++ автоматично можуть перетворювати дані з одного типу в інший.

Дані різних типів по-різному зберігаються в пам’яті. Наприклад, число 10 може зберігатися по-різному, залежно від призначеного цьому числу типу даних. Тобто сполучення нулів та одиниць у представленні одного й того ж числа 10 буде різним залежно від того, як це число буде відтворюватися – цілим чи числом з плаваючою комою.

Розглянемо наступний вираз, де для двох змінних, dresult та dvalue, заданий тип даних double, а для змінної ivalue – тип int: dvalue =dvalue*ivalue;

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

Автоматичні перетворення типів даних при виконанні змішаних операцій виконуються відповідно до ієрархії перетворень. Суть полягає у тому, що з метою підвищення продуктивності у змішаних операціях значення різних типів тимчасово приводяться до того типу даних, який має більший приорітет в ієрархії. Нижче названі типи даних у порядку зменшення приорітету: double float long int short

Якщо значення перетворюється до типу, що має більшу вимірність, тоді не відбувається втрат інформації, внаслідок чого не буде втрат точності обчислень. Розглянемо, що відбувається у випадку приведення значення типу int до типу float. Нехай змінні svaluel1 та ivaluel2 мають тип int, а змінні fvalue та fresult – тип float. Виконаємо такі операції: ivalue1=3; ivalue2-4; fvalue=7.0; fresult=fvalue+ ivalue1/ ivalue2;

Вираз ivalue1/ ivalue2 не є змішаною операцією, це ділення двох цілих чисел, результатом якої буде нуль, оскільки дробна частина ( в даному випадку 0,75) відкидається. Таким чином, змінній fresult буде надано значення 7.0.

Як зміниться результат, коли змінна ivalue2 буде оголошена як float? У такому випадку операція ivalue1/ ivalue2 стане змішаною. Компілятор автоматична приведе значення змінної ivalue1 до типу float – 3.0, і результат ділення буде 0,75, а змінна fresult буде мати значення 7,75. Потрібно пам’ятати, що тип змінної, що знаходиться ліворуч від оператора присвоювання, визначає тип результату обчислень. Нехай змінні fx та fy оголошені як float, а змінна fresult – як int. Наприклад: fx=7.0; fy=2.0; fresult=4.0+fx/fy;

Результатом виконання операції fx/fy буде 3.5. Можна передбачити, що змінній fresult буде надана сума 3.5+4.0. Але, оскільки це цілочислова змінна, компілятор перетворить число 7.5 на ціле, відкинувши дробну частину. Отримане значення 7 є значенням fresult.

Явне перетворення типів

Іноді виникають ситуації, коли потрібно змінити тип змінної, не чекаючи автоматичного перетворення. Для цього є спеціальний оператор приведення типу. Якщо десь у програмі потрібно тимчасово змінити тип змінної, тоді потрібно перед її іменем ввести у круглих дужках назву відповідного типу даних. Наприклад, якщо змінні ivalue1 та ivalue2 мають тип int, а змінні fvalue та fresult – тип float, тоді завдяки явному перетворенню типів у наступних трьох виразах отримаємо однакові результати:

dresult=dvalue+(double) ivalue1/ ivalue2;

dresult=dvalue+ivalue1/(double) ivalue2;

dresult=dvalue+(double) ivalue1/(double) ivalue2

Перед діленням явно приводиться значення однієї чи обох змінних до типу double. До типу double буде автоматично приведений і результат.

Нижче наведені типи даних, які використовуються у середовищі Windows.

Типи даних Windows

Тип

Пояснення

callback

Заміщує специфікацію far pascal у функціях зворотного виклику

handle

32-розрядне беззнакове ціле число, яке застосовується як дескриптор

HDC

Дескриптор контексту пристрою

hwd

Дескриптор вікна

LONG

32-розрядне ціле число зі знаком

lparam

Використовується для опису молодшого аргументу повідомлення

LPCSTR

Те ж саме, що й lpstr, але застосовується для вказування константних рядків

lpstr

32-розрядний вказівник на рядок

ipvoid

Узагальнений тип вказівника, еквівалентний до void *

lresult

Застосовується для повернення значень з віконних процедур

uint

32-розрядне беззнакове ціле число

wchar

16-розрядний символ UNICODE;застосовується для представлення друкованих символів всіх мов світу

winapi

Заміщує специфікацію far pascal у описах API-функцій

wparam

Застосовується для опису старшого параметра повідомлення

CFont aFont;

aFont.CreateFont(16,0,0,0,0,1,1,1,0,0,0,0,FF_ROMAN,0);

CFont *pOldFont = pDC->SelectObject(&aFont);

CPaintDC dc( this );

CLab5Doc* pDoc = GetDocument();

ASSERT_VALID(pDoc);

int nWidth=150;

pDC->SetTextJustification( nWidth , 2 );

pDC->TextOut( 0, 10, pDoc->m_strvchid );