Студопедия

КАТЕГОРИИ:


Архитектура-(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)

Змінні. Клас пам'яті




Тип void

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

Для завдання класу пам'яті використовуються наступні специфікатори:

autoавтоматична змінна. Пам'ять під неї виділяється в стеку і при необхідності ініціалізувався кожного разу при виконанні оператора, що містить її визначення. Звільнення пам'яті відбувається при виході з блоку, в якому описана змінна. Час її життя — з моменту опису до кінця блоку. Для глобальних змінних цей специфікатор не використовується, а для локальних він приймається за умовчанням, тому задавати його явним чином великого сенсу не має.

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

staticстатична змінна. Час життя — постійне. Ініціалізувався один раз при першому виконанні оператора, що містить визначення змінної. Залежно від розташування оператора опису статичні змінні можуть бути глобальними і локальними. Глобальні статичні змінні видно тільки в тому модулі, в якому вони описані.

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

int а; // 1 глобальна змінна а

int main(){

int b; // 2 локальна змінна b

extern int x; // 3 змінна х визначена у іншому місці

static int з; // 4 локальна статична змінна з

а = 1; //5 присвоєння глобальної змінної

int а; //6 локальна змінна а

а = 2; //7 присвоєння локальної змінної

::а = 3; //8 присвоєння глобальної змінної

return 0;

}

int x = 4; // 9 визначення і ініціалізація х

В даному прикладі глобальна змінна а визначена поза всіма блоками. Пам'ять під неї виділяється в сегменті даних на початку роботи програми, областю дії є вся програма. Область видимості — вся програма, окрім рядків 6-8, оскільки в першій з них визначається локальна змінна з тим же ім'ям, область дії якої починається з точки її опису і закінчується при виході з блоку. Змінні b і з — локальні, область їх видимості — блок, але час життя різний: пам'ять під b виділяється в стеку при вході в блок і звільняється при виході з нього, а змінна з розташовується в сегменті даних і існує весь час, поки працює програма.

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

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

Рада ___________________________________________________________________________

Не жалійте часу на придумування відповідних імен. Ім'я повинне відображати сенс величини, що зберігається, бути легко розпізнаваним і, бажано, не містити символів, які можна переплутати один з одним, наприклад, 1,1 (рядкова L) або I (прописна i). Для розділення частин імені можна використовувати знак підкреслення. Не давайте змінним імена, що демонструють знання іноземного сленгу, — адже «як ви човен назвете, так він і попливе». Як правило, змінним з великою областю видимості даються довші імена (бажано з префіксом типу), а для змінні, все життя яких проходить впродовж декількох рядків початкового тексту, вистачить і однієї букви з коментарем при оголошенні. ______________________

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

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

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

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

Автоматичне перетворення виразу “х операція у”

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

2. Якщо після першого кроку вираз залишається змішаним, то відповідно до ієрархії типів
int < unsigned int< long <unsigned long < float < double < long double
операнд нижчого типу підвищується до вищого типу, і значення виразу одержує цей тип. Відмітьте, що unsigned int підвищується до unsigned long, якщо long не може містити всі значення unsigned int.

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

Оголошення: char с; long lg; double d; int i;short s; float f; unsigned u;

 

Вираз Тип Вираз Тип
с - s / i int u * 3 – i Unsigned
u * 3.0 – i double f * 3 – i Float
с + 1 int 3 * s * lg long
с + 1. double d + s double

Автоматичне перетворення може відбуватися при присвоєнні. Наприклад:

d = i

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

На додаток до неявних перетворень, які можуть відбуватися при присвоєні і в змішаних виразах, існує явне перетворення, зване приведенням (cast).

Хай i — ціле, тоді




Поделиться с друзьями:


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


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



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




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