Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Консп_лекцій_Частина_1. Основи представлення с.doc
Скачиваний:
9
Добавлен:
06.11.2018
Размер:
839.68 Кб
Скачать

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. Неявне перетворення типів

Мова програмування С++ встановлює набір стандартних перетворень між об’єктами різних вбудованих типів, що неявно виконуються компілятором в таких випадках:

  1. Використання в арифметичному виразі операндів з різними типами.

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

int ix = 1;

double dx = 5.74;

if ix + dx {…}; // змінна ix перетворюється в тип double зі значенням 1.0

  1. Присвоювання значення виразу одного типу об’єкту іншого типу.

У цьому випадку результуючим буде тип об’єкта, якому присвоюється значення, наприклад:

ix = dx; // dx зі значенням 5.74 перетворюється в int зі значенням 5

  1. Передача функції аргумента, тип якого відрізняється від типу відповідного формального параметра. У цьому випадку тип фактичного аргумента приводиться до типу формального параметра, наприклад:

extern double sqrt( double );

cout << "Квадратний корінь з 2 = " << sqrt( 2 ); // 2 перетворюється в double 2.0

  1. Повернення з функції значення, тип якого не співпадає з типом результату, заданим в оголошенні функції. У цьому випадку тип значення, що фактично повертається, приводиться до оголошеного, наприклад:

double fun ( int ix1, int ix2 ){

return ix1 – ix2; // результат перетворюється в double

}