Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Традиційні перетворення

Будь-яке арифметичне вираження ніби х + у має тип і значення. Наприклад, якщо обоє змінні х і у одного типу (скажемо int), то х + у — теж ціле. Якщо х і у різних типів, то х + у називається змішаним вираженням. Припустимо, х типу short, а у типу int. Тоді значення х буде перетворено до цілого, і вираження х + у отримає тип int. Зверніть увагу, що значення х в пам'яті залишається незмінним. Перетвориться тільки тимчасова копія х при обчисленні значення вираження. Тепер припустимо, що обоє змінні х і у мають тип short. Хоча х + у і не є змішаним вираженням, все одно станеться автоматичне перетворення; х і у будуть підвищені до int і вираження буде цілим.

Загальні правила прості:

Автоматичне перетворення вираження «х операція у»

1. Усе bool, char, short або enum підвищуються до int. Цілі типи, які не можуть бути представлені як int, підвищуються до unsigned.

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

int < unsigned < long < unsigned long < float <

< double < long double

операнд нижчого типу підвищується до вищого типу, і значення вираження отримує цей тип. Зверніть увагу, що unsigned підвищується до unsigned long, якщо long не може містити усі значення unsigned.

Щоб проілюструвати неявні перетворення, ми зробимо наступні оголошення і перерахуємо різні змішані вирази разом з відповідними типами:

Оголошення

char с; long lg; double d;  
short s; float f; unsigned u; int i;
Вираження Тип Вираження Тип
с - s / i int u * 3 - i unsigned
и * 3.0 - i double f * 3 - i float
с + 1 int 3 * s * lg long
с + 1. 0 double d + s double

Автоматичне перетворення може відбуватися при привласненні. Наприклад, d = i переведе ціле значення i в double і потім присвоїть його d; тип усього вираження буде double. Підвищення (чи розширення) типу, як у вираженні d = i, зазвичай буде виконано правильно, а ось пониження (чи звуження) типу, як у вираженні i = d, може привести до втрати інформації. Тут дробова частина d буде відкинута. Що саме станеться, в кожному випадку залежить від машини.

На додаток до неявних перетворень, які можуть відбуватися при привласненнях і в змішаних виразах, існує явне перетворення, зване приведенням (cast)[2]. Нехай i — ціле, тоді

static_cast<double>(i)

виконає приведене значення i так, що вираження матиме тип double. Сама змінна i залишається незмінною. Конструкція static_cast дозволяє організувати перетворення типів коректне, переносимо і оборотно. Приклади:

static_cast<char>('А' + 1.0)

х = static_cast<double>(static_cast<int>(у) +1)

Приведення типів, залежні від представлення або системи, використовують

reinterpret_cast:

i = reinterpret_cast<int>(&х) //системно-залежні

Подібні приведення типів небажані, і їх краще уникати.

У C++ існують ще два спеціальні приведення типів: const_cast і dynamic_cast. Обговорення dynamic_cast вимагає розуміння спадкоємства «Ідентифікація типу на етапі виконання». Використання модифікатора const призводить до того, що значення змінної не можна змінити. Зрідка таке обмеження потрібно обійти. Це називається відміною постійності (cast away constness). У подібних випадках використовується const_cast, як тут:

foo(const_cast<int>(c_var)); //використовується для виклику foo

Старі системи C++ надають нестрогу форму приведення типів:

(тип) вираження або тип(вираження)

Ось деякі приклади:

у = i/double(7); //розділить з подвійною точністю

ptr = (char*) (i + 88); //ціле до значення покажчика

Такі застарілі конструкції вважаються такими, що вийшли із, але вони використовуються у багатьох старих компіляторах і початкових текстах. Старі системи не відрізняють порівняно безпечні приведення типів, такі як static_cast, від менш надійних системно-залежних, ніби reinterpret_cast. Крім того, імена нових приведених типів говорять самі за себе. Наприклад, призначення const_cast очевидно з назви.

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

<== предыдущая лекция | следующая лекция ==>
Ініціалізація | Типи, що перераховують
Поделиться с друзьями:


Дата добавления: 2013-12-14; Просмотров: 287; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.008 сек.