Типи даних. Ініціалізація...

38
1 Проф. Куссуль Н.М. Типи даних. Ініціалізація змінних

Transcript of Типи даних. Ініціалізація...

Page 1: Типи даних. Ініціалізація змінних4kpi.ikd.kiev.ua/wp-content/uploads/downloads/2014/11/Lecture2-CP… · Типи даних в С++ До простих

1

Проф. Куссуль Н.М.

Типи даних. Ініціалізація змінних

Page 2: Типи даних. Ініціалізація змінних4kpi.ikd.kiev.ua/wp-content/uploads/downloads/2014/11/Lecture2-CP… · Типи даних в С++ До простих

2

Вступ

Кожне ім'я (ідентифікатор) в C++ програмі має асоційований з ним тип даних

Цей тип визначає, які операції можна застосовувати до імені (тобто до об'єкта, на який воно посилається), і як ці операції інтерпретуються

Page 3: Типи даних. Ініціалізація змінних4kpi.ikd.kiev.ua/wp-content/uploads/downloads/2014/11/Lecture2-CP… · Типи даних в С++ До простих

3

Приклад. Неосмислений вираз

Розглянемо вираз

y = x + f(t)

Вираз буде мати сенс тоді, коли імена y, x, t і функція f(t) будуть оголошені, тобто для них повинні бути визначені операції “ = ”, “+” і функція f(t)

Page 4: Типи даних. Ініціалізація змінних4kpi.ikd.kiev.ua/wp-content/uploads/downloads/2014/11/Lecture2-CP… · Типи даних в С++ До простих

4

Типи даних – вбудовані типи

Вбудовані типи це типи, які підтримує мова

програмування

Вбудовані типи бувають

прості (базові) та похідні, які утворюються від базових

Page 5: Типи даних. Ініціалізація змінних4kpi.ikd.kiev.ua/wp-content/uploads/downloads/2014/11/Lecture2-CP… · Типи даних в С++ До простих

5

Типи даних в С++ До простих типів відносяться bool int char float double

До похідних типів відносяться масиви (int a[5]) вказівники (int*a)

Існує також порожній тип void (не має значення).

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

Page 6: Типи даних. Ініціалізація змінних4kpi.ikd.kiev.ua/wp-content/uploads/downloads/2014/11/Lecture2-CP… · Типи даних в С++ До простих

6

Модифікатори

У С++ прості типи можуть бути модернізовані за допомогою ключових слів: short

long

signed

unsigned

Page 7: Типи даних. Ініціалізація змінних4kpi.ikd.kiev.ua/wp-content/uploads/downloads/2014/11/Lecture2-CP… · Типи даних в С++ До простих

7

Користувацькі типи

Крім вбудованих типів у С++ існують користувацькі типи, які вимагають попереднього оголошення.

Вони зазвичай складені структура (struct) об'єднання (union) перерахування (enum) класи (сlass)

Page 8: Типи даних. Ініціалізація змінних4kpi.ikd.kiev.ua/wp-content/uploads/downloads/2014/11/Lecture2-CP… · Типи даних в С++ До простих

8

Характеристики основних типів даних мови С++

Тип Розмір пам'яті, байтів

Діапазон значень для 16-розрядної архітектури

[signed] char 1 -128 127 unsigned char 1 0 255 [signed] short [int] 2 -32768 32767

unsigned short [int] 2 0 65535

[signed] int машинне слово -32768 32767

unsigned int машинне слово 0 65535 [signed] long [int] 4 -2147483648 2147483647

[unsigned] long [int] 4 0 4294967295

float 4 3.4e-38 3.4e38 double 8 1.7e-308 1.7e308

Завдання на додаткові бали: Проаналізувати специфіку інтегральних типів даних в С++ для 32 і 64 розрядної архітектури. Створити презентацію на 2-4 слайди

Page 9: Типи даних. Ініціалізація змінних4kpi.ikd.kiev.ua/wp-content/uploads/downloads/2014/11/Lecture2-CP… · Типи даних в С++ До простих

9

Розмір об’єктів

Для визначення розміру об'єкту в одиницях (найчастіше в байтах) використовується оператор sizeof:

cout << sizeof(int);

Діапазони всіх типів змінних (максимальні й мінімальні значення) можна одержати з заголовочного файлі climits ( в більш ранніх реалізаціях - limits.h)

Page 10: Типи даних. Ініціалізація змінних4kpi.ikd.kiev.ua/wp-content/uploads/downloads/2014/11/Lecture2-CP… · Типи даних в С++ До простих

10

Приклад. Осмислений вираз

Повертаючись до першого прикладу,

y = x + f(t)

необхідно оголосити: float y;

int x = 7; // ініціалізація

float f(int);

Приклад став осмисленим!

Page 11: Типи даних. Ініціалізація змінних4kpi.ikd.kiev.ua/wp-content/uploads/downloads/2014/11/Lecture2-CP… · Типи даних в С++ До простих

11

Тип bool Логічний тип bool має два значення: true (1) false (0)

Цей тип використовується для представлення результатів логічних операцій Приклад bool b1=a==b // якщо a=b, b1=true, інакше b1=false

bool b=7; // b=true int i=true; // i=1

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

Page 12: Типи даних. Ініціалізація змінних4kpi.ikd.kiev.ua/wp-content/uploads/downloads/2014/11/Lecture2-CP… · Типи даних в С++ До простих

12

Тип сhar Символьний тип сhar майже завжди займає 1 байт (знаковий або беззнаковий - залежить від реалізації) Кожна символьна константа має числове значення. Приклад char c = ‘a’; cin >> c;

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

Page 13: Типи даних. Ініціалізація змінних4kpi.ikd.kiev.ua/wp-content/uploads/downloads/2014/11/Lecture2-CP… · Типи даних в С++ До простих

13

Тип int Цілий тип int за замовчуванням є знаковим

int=signed int Тип int залежить від реалізації, тому цілі літерали краще записувати в десятковій формі (8-ва й 16-ва форми можуть призвести до неявного «сюрпризу»)

Приклад int a = 545; 0хffff = 65535 // на 32-розрядному комп'ютері

Page 14: Типи даних. Ініціалізація змінних4kpi.ikd.kiev.ua/wp-content/uploads/downloads/2014/11/Lecture2-CP… · Типи даних в С++ До простих

14

Типи із плаваючою точкою Типи із плаваючою точкою float - oдинарної точності (4 байти) double - подвійної точності (8 байт) long double - розширеної точності

Приклад. Літерали із плаваючою точкою: -0.457

1.23

1.23е-15

1.2е10

Page 15: Типи даних. Ініціалізація змінних4kpi.ikd.kiev.ua/wp-content/uploads/downloads/2014/11/Lecture2-CP… · Типи даних в С++ До простих

15

Тип void Тип void (порожній) синтаксично поводиться як основний тип

Однак використати його можна тільки як частину похідного типу, об'єктів типу void не існує

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

Приклад void f(); //функція не повертає значення void * p; //вказівник на об'єкт невідомого типу

void a; //помилка

Page 16: Типи даних. Ініціалізація змінних4kpi.ikd.kiev.ua/wp-content/uploads/downloads/2014/11/Lecture2-CP… · Типи даних в С++ До простих

16

Перетворення типів Перетворення типів від одного до іншого відбувається при присвоюванні і в змішаних виразах float d=3; //дані типу int перетворюються в тип float

В змішаних виразах відбувається два види автоматичних перетворень типів: 1) типи bool, char, unsigned char, signed char, short перетворюються в тип int

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

Page 17: Типи даних. Ініціалізація змінних4kpi.ikd.kiev.ua/wp-content/uploads/downloads/2014/11/Lecture2-CP… · Типи даних в С++ До простих

17

Ієрархія типів

int < unsigned < long < unsigned long < float < double < long double

Page 18: Типи даних. Ініціалізація змінних4kpi.ikd.kiev.ua/wp-content/uploads/downloads/2014/11/Lecture2-CP… · Типи даних в С++ До простих

18

Зведення типів Операція зведення типів явне перетворення даних одного типу в дані іншого типу.

Синтаксис - одномісна операція, що має той же пріоритет, що й унарная операція (Тип)

Приклад int i; (float)i+1 рівносильно ((float)i) +1

Зведення типів є коректним, якщо воно приводить до розширення типу, і некоректним, якщо воно приводить до звуження типу (типу, більш низькому за ієрархією)

Page 19: Типи даних. Ініціалізація змінних4kpi.ikd.kiev.ua/wp-content/uploads/downloads/2014/11/Lecture2-CP… · Типи даних в С++ До простих

19

Ініціалізація змінних

Page 20: Типи даних. Ініціалізація змінних4kpi.ikd.kiev.ua/wp-content/uploads/downloads/2014/11/Lecture2-CP… · Типи даних в С++ До простих

20

Основні визначення

Оголошення змінної пов'язує тип з її ім'ям

Визначення змінної виділяє для неї пам'ять. Більшість оголошень є також визначеннями

Ініціалізація змінної - це виділення пам'яті для неї й присвоєння початкового значення

Page 21: Типи даних. Ініціалізація змінних4kpi.ikd.kiev.ua/wp-content/uploads/downloads/2014/11/Lecture2-CP… · Типи даних в С++ До простих

21

Структура оголошення/ініціалізації [специф.] баз_тип ідентифікатор [= ініціалізатор];

Специфікатор

це ключове слово, що описує характеристики, не пов'язані з типом (extern й virtual) і вказує, що оголошення не є визначенням.

Типові оператори оголошення:

суфіксфункціямасив

)(][

префікспосилання

вказівникйконст ант ниconstвказівник

&

Page 22: Типи даних. Ініціалізація змінних4kpi.ikd.kiev.ua/wp-content/uploads/downloads/2014/11/Lecture2-CP… · Типи даних в С++ До простих

22

Приклади char ch;

int count = 1;

const double pi = 3.141592;

extern int error_number; /*оголошення, але не визначення, змінна визначена в іншому файлі*/

char *name = “Njal”;

char *season[ ] = {“spring”, “summer”, “autumn”, “winter”}

typedef complex point;// оголошення???

double sqrt(double);

Page 23: Типи даних. Ініціалізація змінних4kpi.ikd.kiev.ua/wp-content/uploads/downloads/2014/11/Lecture2-CP… · Типи даних в С++ До простих

23

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

Така змінна називається глобальною і є видимою до кінця файлу.

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

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

Page 24: Типи даних. Ініціалізація змінних4kpi.ikd.kiev.ua/wp-content/uploads/downloads/2014/11/Lecture2-CP… · Типи даних в С++ До простих

24

Приклад. Оголошення змінних. #include <iostream.h> void sum(int ); // прототип (оголошення) функції int s=0; // глобальна змінна void main(){ int b, k; // локальні змінні cout << "\nВведіть кількість доданків"; cin >> k; for(int i=0; i<k; i++) { cout << "\nВведіть новий доданок "; cin >> b; sum(b);// виклик функції } cout<<"\ns="<<s; } void sum(int c) { s=s+c; }

Page 25: Типи даних. Ініціалізація змінних4kpi.ikd.kiev.ua/wp-content/uploads/downloads/2014/11/Lecture2-CP… · Типи даних в С++ До простих

25

Ініціалізація Ініціалізатор визначає якісний стан об'єкта. Приклад int x=7; int x[] = { 1, 3, 5 }; //описує й ініціалізує x як одновимірний масив, що має три компонента

float y[4][3] = { { 1, 3, 5 }, { 2, 4, 6 }, { 3, 5, 7 }}; // ініціалізація масиву: значення 1, 3 та 5 ініціалізують перший рядок масиву, а саме, y[0][0], y[0][1], y[0][2] (нумерація рядків і стовпців починається з нуля). Ініціалізатор містить 9 значень, тому четвертий рядок масиву ініціалізується значенням 0 (тобто y[3][0], y[3][1], y[3][2]).

float y[4][3] = { 1, 3, 5, 2, 4, 6, 3, 5, 7}; // аналогічно попередньому виразу

Page 26: Типи даних. Ініціалізація змінних4kpi.ikd.kiev.ua/wp-content/uploads/downloads/2014/11/Lecture2-CP… · Типи даних в С++ До простих

26 26

Простір імен

Простір імен – модель або абстрактне сховище, створене для логічного групування імен

namespace им’я { // оголошення об’єкта }

Page 27: Типи даних. Ініціалізація змінних4kpi.ikd.kiev.ua/wp-content/uploads/downloads/2014/11/Lecture2-CP… · Типи даних в С++ До простих

27 27

Синтаксис простору імен

Приклад:

namespace MyNameSpace { int i, k; void myfunc(int j) { cout << j; } }

Після оголошення простору імен, до об’єктів можно звертатись:

MyNameSpace::i =10;

Page 28: Типи даних. Ініціалізація змінних4kpi.ikd.kiev.ua/wp-content/uploads/downloads/2014/11/Lecture2-CP… · Типи даних в С++ До простих

28 28

Директива using

Щоб спростити доступ до об’єктів, слід викорисовувати директиву using:

using MyNameSpace::k; // видима лише k

k = 10; // допустимо, оскільки k видима

using namespace MyNameSpace; //всі члени MyNameSpace видимі

i = 10; // допустимо, оскільки всі //члени MyNameSpace видимі

Page 29: Типи даних. Ініціалізація змінних4kpi.ikd.kiev.ua/wp-content/uploads/downloads/2014/11/Lecture2-CP… · Типи даних в С++ До простих

29 29

Приклад

Page 30: Типи даних. Ініціалізація змінних4kpi.ikd.kiev.ua/wp-content/uploads/downloads/2014/11/Lecture2-CP… · Типи даних в С++ До простих

30

Правило одного визначення У С++ для кожного імені повинно бути рівно одне визначення. Оголошень може бути декілька але всі вони повинні бути погоджені за типом.

Правило одного визначення (ODR – one-definition rule) формулюється наступним чином:

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

Page 31: Типи даних. Ініціалізація змінних4kpi.ikd.kiev.ua/wp-content/uploads/downloads/2014/11/Lecture2-CP… · Типи даних в С++ До простих

31

Приклад 1 Файл file1.cpp struct S{int a;char b;};

void f(S*);

Файл file2.cpp struct S{int a; char b;};

void f(S* p){/* ... */};

Ці два оголошення припустимі, але нерозумні, тому що при супроводі file2.cpp програміст може прийняти свою версію визначення структури S.

Page 32: Типи даних. Ініціалізація змінних4kpi.ikd.kiev.ua/wp-content/uploads/downloads/2014/11/Lecture2-CP… · Типи даних в С++ До простих

32

Приклад 2 Файл s.h struct S{int a;char b;}; // визначення структури

void f(S*); // оголошення функції (прототип)

Файл file1.cpp #include “s.h”

// виклик функції f();

Файл file2.cpp #include “s.h”

void f(S*p){/* ...*/};

Page 33: Типи даних. Ініціалізація змінних4kpi.ikd.kiev.ua/wp-content/uploads/downloads/2014/11/Lecture2-CP… · Типи даних в С++ До простих

33

Приклад 2 (продовж.)

Порушення правила ODR може бути джерелом дуже тонких помилок. Тому потрібно створювати як можна більше

самодостатніх заголовних файлів.

struct S{ int a; char b ;}; void f (S*);

# include “s.h” int main() {... /*виклик функції*/...}

# include “s.h” void f(S* p) {/* тіло функції */}

s.h

file2.cpp file1.cpp

Page 34: Типи даних. Ініціалізація змінних4kpi.ikd.kiev.ua/wp-content/uploads/downloads/2014/11/Lecture2-CP… · Типи даних в С++ До простих

34

Час життя об'єкта даних Об'єкт створюється, коли зустрічається його визначення і знищується, коли його ім'я виходить із області видимості

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

Приклад char symbol; int number = 1; double sqrt;

Page 35: Типи даних. Ініціалізація змінних4kpi.ikd.kiev.ua/wp-content/uploads/downloads/2014/11/Lecture2-CP… · Типи даних в С++ До простих

35

Час життя об'єкта даних Глобальні змінні створюються та ініціалізуються (тільки) один раз й "живуть" до завершення програми (час життя глобальної змінної – до кінця роботи програми). Об'єкти, визначені описом із ключовим словом static, поводяться так само. Не ініціалізована явно статична (static) змінна неявно ініціалізується нулем.

Час життя локальної змінної – до виходу з блоку.

Page 36: Типи даних. Ініціалізація змінних4kpi.ikd.kiev.ua/wp-content/uploads/downloads/2014/11/Lecture2-CP… · Типи даних в С++ До простих

36

Приклад int a = 1;

void f()

{

int b = 1; // ініціалізація b відбувається з //кожним викликом функції f()

static int c = 1; // статична змінна створюється // тільки один раз

cout << " a=" << a++ << " b=" << b++ << " c=" << c++ << " \n";

}

int main() { while (a < 4) f(); return 0;} Результат виконання програми :

a = 1 b = 1 c = 1

a = 2 b = 1 c = 2

a = 3 b = 1 c = 3

Page 37: Типи даних. Ініціалізація змінних4kpi.ikd.kiev.ua/wp-content/uploads/downloads/2014/11/Lecture2-CP… · Типи даних в С++ До простих

37

Приклад int a;

int a; //помилка! Повторне оголошення

extern int error_number;

extern short error_number; //невідповідність типів

Page 38: Типи даних. Ініціалізація змінних4kpi.ikd.kiev.ua/wp-content/uploads/downloads/2014/11/Lecture2-CP… · Типи даних в С++ До простих

38

Питання

Що таке оголошення, визначення та ініціалізація змінної або функції?

Навести приклад оголошення, що не є визначенням.

Навести приклад ініціалізації.

Знайти некоректність в першому питанні.