- •Конспект лекцій ( частина і ) з дисципліни
- •1. Поняття інформації та основні форми її подання
- •2. Представлення даних в пам’яті комп'ютера
- •3. Класифікація типів даних
- •4. Базові типи даних
- •4.1. Порожній тип
- •4.2. Логічний тип даних
- •4.3. Символьні типи даних
- •4.4. Цілочисельні типи даних
- •4.5. Дійсні типи даних
- •5. Похідні типи даних
- •5.1. Переліки
- •5.2. Вказівники
- •5.3. Посилання
- •5.4. Масиви
- •5.5. Структури
- •5.6. Бітові поля
- •5.7. Об'єднання
- •6. Перетворення типів
- •6.1. Неявне перетворення типів
- •6.1.1. Арифметичне перетворення типів
- •6.1.2. Перетворення типів при присвоюванні
- •6.2. Явне перетворення типів
- •6.3. Застаріла форма явного перетворення
- •Список літератури
- •1. Поняття інформації та основні форми її подання ------------------------------------------- 3
- •Основи представлення данних в пам'яті комп'ютера
- •6.050102 “Комп’ютерна інженерія
6. Перетворення типів
Обчислення значень виразів в операторах мови C++ забезпечується виконанням операцій і викликом функцій. Операції використовують операнды, функції вимагають параметрів. Операнды і параметри характеризуються типами. У мові C++ не існує операцій, що, наприклад, забезпечували б додавання або множення операндів різних типів. Частину проблем, пов'язаних з узгодженням типів операндів і параметрів транслятор бере на себе. Фактично це означає введення ще однієї системи правил, що називається правилами стандартного перетворення типів. Перетворення типів мають місце в присвоюваннях, cast - операціях, викликах функцій і при виконанні операцій.
Якщо в виразах зустрічаються операнды різних типів, то вони перетворюються до загального типу відповідно до деякого набору правил. Загалом, автоматично здійснюються тільки такі перетворення, що мають зміст, такі, наприклад, як перетворення цілого в дійсне. Вирази ж, позбавлені змісту, такі, наприклад, як використання змінної типу float в масивах як індекса, заборонені. Нехай, наприклад, потрібно виконати таку операцію:
int ix = 0;
ix = 5.74 + 1; // зазвичай компілюється з попередженням
В цьому прикладі додаються літерали різних типів: 5.74 типу double та 1 типу int. Мова програмування C++ не може безпосередньо додати подібні операнди, спочатку відбувається зведення їх до одного типу. Для цього існують правила перетворення арифметичних типів. Загальний принцип такий: перейти від операнда меншого типу до більшого, щоб не втратити точності обчислень. В наведенному прикладі ціле значення 1 трансформується в тип double, і тільки після цього відбувається додавання. Таке перетворення виконується незалежно від бажання програміста, відтак воно і отримало назву неявного перетворення типу. Результат додавання двох чисел типу double теж має тип double. В прикладі це значення рівне 6.74. Тепер його необхідно присвоїти змінній ix. Тип змінної ix і тип результату обчислень 6.74 не співпадають, отже, тип результату буде приведений до типу змінної, тобто до типу int. Перетворення double в int відбувається автоматично, шляхом відкидання дробової частини (а не заокругленням її). Таким чином, 6.74 перетворюється в 6, і даний результат присвоюється змінній ix. При такому перетворенні може виникати втрата точності, тому більшість компіляторів видають попередження.
Оскільки компілятор не заокруглює числа при перетворенні double в int, то при необхідності програміст повинен робити це сам, наприклад:
double dx = 5.74;
int ix = 1;
ix = dx + ix + 0.5; // перетворення із заокругленням
В цьому прикладі змінна іх набуває значення 7.
За бажанням можна здійснити явне перетворення типів:
ix = static_cast< int >(5.74) + 1;
В цьому прикладі явно вказується компілятору привести величину 5.74 до типу int, а не додержуватись правил за замовчуванням.
6.1. Неявне перетворення типів
Мова програмування С++ встановлює набір стандартних перетворень між об’єктами різних вбудованих типів, що неявно виконуються компілятором в таких випадках:
-
Використання в арифметичному виразі операндів з різними типами.
У цьому випадку типи всіх операндів приводяться до типу одного операнда, розмір якого є найбільшим (це називається арифметичним перетворенням), наприклад:
int ix = 1;
double dx = 5.74;
if ix + dx {…}; // змінна ix перетворюється в тип double зі значенням 1.0
-
Присвоювання значення виразу одного типу об’єкту іншого типу.
У цьому випадку результуючим буде тип об’єкта, якому присвоюється значення, наприклад:
ix = dx; // dx зі значенням 5.74 перетворюється в int зі значенням 5
-
Передача функції аргумента, тип якого відрізняється від типу відповідного формального параметра. У цьому випадку тип фактичного аргумента приводиться до типу формального параметра, наприклад:
extern double sqrt( double );
cout << "Квадратний корінь з 2 = " << sqrt( 2 ); // 2 перетворюється в double 2.0
-
Повернення з функції значення, тип якого не співпадає з типом результату, заданим в оголошенні функції. У цьому випадку тип значення, що фактично повертається, приводиться до оголошеного, наприклад:
double fun ( int ix1, int ix2 ){
return ix1 – ix2; // результат перетворюється в double
}
