You are on page 1of 7

ЛЕКЦІЯ № 5

КОНСТАНТИ, ЗМІННІ, ВИРАЗИ

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


Принципова відмінність між змінними і константами полягає в тому, що для збереження
значень змінних під час виконання програми відводиться частина пам'яті, а константи є
частиною коду програми. Під час компіляції програми компілятор замінює
ідентифікатори констант їх значеннями в операторах, де ці ідентифікатори зустрічаються.
Ідентифікатори констант припиняють своє існування після компіляції. Тому під час
виконання програми значення змінної може змінюватися, а константи – ні.
Використовуючи константи, змінні і операції можна створювати вирази для
організації обчислень.

5.1 Літерали

У мовах C, C++ для позначення поняття константа використовується поняття


літерал або літеральна константа. Сенс його той же – фіксоване значення, яке не може
змінюватися в програмі. Константи можуть мати будь-який базовий тип даних. Спосіб
представлення кожної константи залежить від її типу даних:
– символьний літерал, наприклад, ch = ‘z’;
– двобайтовий символьний літерал (тип wchar_t) перед символом в лапках додається
буква L:
wchar_t wc;
wc = L’A’;
– цілочисельні константи – числа без дробової частини, не містять десяткової крапки,
задаються в різних системах числення:
1) десятковий літерал – число із знаком або без знаку, починається з будь-якої
цифри, окрім нуля:
count = 20;
2) вісімковий літерал – число із знаком або без знаку, починається з нуля (цифри від
0 до 7);
3) шістнадцятиричний літерал – комбінація цифр від 0 до 9 і букв від А до F (із
знаком або без знаку), починається з 0x.
За умовчанням компілятор зв'язує цілочисельний літерал з сумісним і одночасно
найменшим по займаній пам'яті типом даних, починаючи з типа int. Наприклад, для
шістнадцяти розрядного середовища число 10 буде описано типом int, число 103000 –
long int.
– дійсні літерали повинні містити десяткову крапку, за якою слідує дробова
частина. Можна використовувати експоненціальне представлення числа. За умовчанням
дійсний літерал компілятором відноситься до типу double (дійсний з подвійною точністю).
Тип літерала може бути заданий явно в оголошенні константи або при
безпосередньому завданні її в програмі в первинному вигляді. Щоб задати точний тип
числової константи додається відповідний суфікс наприкінці числа:
float – F;
long –L;
unsigned –U.
Наприклад:
int 1, 123, 21000, -234;
long int 35000L, -34L;
unsigned int 1000U, 987U;
unsigned long 12323UL;
float 123.23F, 4.34e-3F;
double 23.23, -0.98763;
long double 1001.2LF;

Існує два способи оголошення констант:


1) за допомогою директиви препроцесора #define, яка дає вказівку компілятору
замінити у вихідному коді програми <ім'я константи> на значення літерала:
#define <имя константы> <литерал>
Наприклад:
#define МАХ 10
2) за допомогою ключового слова const, використання якого визначає, що значення
ініціалізувалося у момент оголошення і далі вже не може змінюватися:
const int count = 100;
const float pi = 3.14159;
const char iks = ’x’;

Мова С/С++ підтримує ще один вбудований тип літерала –рядковий. Рядок – це


набір символів у подвійних лапках.
“<Символьний рядок>”
У мові С/С++ немає спеціального типу даних для опису рядків. Рядки
представляються у вигляді масиву елементів типу char.

5.2 Змінні

Змінна – це іменована область пам'яті, в якій зберігаються дані певного типу. У


змінної є ім'я і значення. Ім'я служить для звернення до області пам'яті, в якій зберігається
значення. Під час виконання програми значення змінної можна змінювати. Перед
використанням будь-яка змінна повинна бути описана. На мові програмування С
допускається оголошення змінної в будь-якому місці програми (рекомендується – на
початку програми).
Загальний вигляд синтаксису опису змінних:

[<клас пам'яті>] [const] <тип даних> <ім'я змінної> [<ініціалізація>];

Необов'язкове поле <клас пам'яті> може приймати одне із значень: auto, extern,
static, register.
Модифікатор const використовується для констант.
Ініціалізація записується у вигляді = <значення>.
Опис змінної задає її область видимості (область дії).
Область дії ідентифікатора – це частина програми, в якій його можна
використовувати для доступу до пов'язаної з ним області пам'яті. Залежно від області дії
змінна може бути локальною або глобальною.
Якщо змінна визначена всередині блоку (блок обмежений {}), вона називається
локальної, область її дії – від точки опису до кінця блоку, включаючи всі вкладені блоки.
Якщо змінна визначена поза будь-якого блоку, вона називається глобальної і
область її дії – файл, в якому вона визначена, від точки опису – до його кінця.
Областю видимості ідентифікатора називається частина тексту програми, з якої
допустимо звичайний доступ до пов'язаної з ідентифікатором областю пам'яті. Найчастіше
область видимості збігається з зоною дії.
Винятком є ситуація, коли у вкладеному блоці описана змінна з таким же ім'ям. У
цьому випадку зовнішня змінна у вкладеному блоці невидима, хоча він і входить в її
область дії. До цієї змінної можна звернутися використовуючи операцію доступу до
області видимості ::.
Клас пам'яті визначає час життя і область видимості програмного об'єкта (зокрема,
змінної). Якщо клас пам'яті не вказано явним чином, він визначається компілятором
виходячи з контексту оголошення.
Для завдання класу пам'яті використовуються ідентифікатори:
auto – автоматична змінна. Пам'ять для неї виділяється в стеці і при необхідності
ініціалізується кожен раз, при виконанні оператора, що містить її визначення (для
глобальних змінних – не використовується, для локальних – установлюється за
умовчанням, тому явно, як правило, не вказується);
extern – змінна визначена в іншому місці програми (в іншому файлі або далі в коді).
Використовується для створення змінних, доступних у всіх модулях програми;
static – статична змінна. Час життя постійний. Ініціалізується один раз, при
першому виконанні оператора, що містить визначення змінної. Може бути локальною і
глобальною;
register – аналогічно auto, але пам'ять виділяється по можливості в регістрах
процесора.

Приклад оголошення змінних:


int a; //глобальна змінна а
int main()
{int b; //локальна змінна b
extern int x; // х визначена в іншому місці
static int c; // локальна статична змінна с
a=1; //присвоєння значення глобальній змінній а
int a; //локальна змінна а
a=2; // присвоєння значення локальній змінній а
::a=3; // присвоєння значення глобальній змінній а

return 0;
}
int x=4;

5.3 Арифметичні операції мови С/С++

Операції бувають бінарними й унарними. Існують чотири загальні класи операцій


мови програмування С/С++: арифметичні, відносин, логічні, порозрядні.
До арифметичних операцій відносяться:
+ складання;
- віднімання;
* множення;
/ ділення (для цілочисельних типів);
% ділення по модулю;
++ інкремент. Операція інкремента виконує складання операнда з числом 1;
-- декремент. Операція декремента виконує віднімання 1 зі свого операнда.
х = х + 1; // ++х;
х = х – 1 ; // --х;
Операції інкремента і декремента можуть стояти як перед своїм операндом
(префіксна форма), так і після нього (постфіксна форма).
++х; //префіксна форма.
х++; //постфіксная форма.
У префіксній формі спочатку виконується операція інкремента/декремента, щоб
операнд набув нового значення, яке потім використовується іншою частиною виразу.
У постфіксній формі використовується у виразі старе значення операнду, а потім
виконується операція інкремента/декремента, в результаті якої операнд прийме нове
значення.
Приклад.
х = 10;
у = ++х;
Змінна y отримає значення рівне 11, тому що префіксна форма інкремента спочатку
збільшує значення х на 1, а потім це значення буде занесено у змінну y.
х = 10;
у = х++;
Змінна y отримає значення рівне 10, оскільки постфіксна форма інкремента
виконує збільшення на 1 після виконання надання значення змінній у.
Більшість компіляторів мови С/С++ створюють для операцій «інкремент» і
«декремент» ефективніший код в порівнянні з кодом, що генерується при використанні
звичайного оператора складання і віднімання одиниці. Тому програмісти-професіонали
вважають за краще використовувати операції «інкремент» і «декремент».
Пріоритет арифметичних операцій в порядку зменшення: ++, --, - (унарний мінус)
*, /, %, +, – .
Операції одного рівня обчислюються компілятором зліва направо. Для зміни
порядку виконання операцій використовуються круглі дужки. Операція або набір
операцій, ув'язнений в круглі дужки набувають вищого пріоритету.

5.4 Операції відносин і логічні оператори

Основні операції відносин і логічні приведені в таблицях 5.1, 5.2.


Згідно із стандартом С++ результат виконання операцій відносин і логічних має
тип bool, т.е – значення true (1) або false (0). У мові С (при використанні старіших
компіляторів) результат виконання цих операцій має значення типу int (ненульове ціле
(наприклад, 1 або будь-яке інше) або нуль). Операнди, що беруть участь в операціях
відносин можуть мати практично будь-який тип даних, головне, щоб їх можна було
порівнювати.

Таблиця 5.1 – Операції відносин


Позначення
Значення Запис
операції
== рівно? х==у
!= не рівно? х!=у
>,< більш, меньш? x>y; x<y
>=, більше або рівно? x>=y
<= меньш або рівно? x<=y

Таблиця 5.2 – Логічні операції


Позначення
Значення Запис
операції
&& Логічне «і» <вираз 1> && <вираз 2>
|| Логічне «або» <вираз 1> || <вираз 2>
! Логічне «ні» ! <вираз>

Оператори відносин і логічні мають нижчий пріоритет (таблиця. 5.3), ніж


арифметичні операції. Наприклад, 10>1+12; буде обчислено:
1) 1+12=13
2) 10>13, тобто false .
Пріоритет операцій відношення і логічних операцій в порядку зменшення: !, >, >=
<, <= ==, !=, &&, ||.

Таблиця 5.3 – Пріоритети операцій МП С/С++


Пріоритет Операція
()[]
1 -> (непряме звернення до членів класу)
. (пряме звернення до членів класу)
! ++ --
2 *(посилання на адресу)
&( отримання адресу)
3 *(множення) / %
4 + -
<< (зрушення вліво)
5
>> (зрушення вправо)
6 < <= > >=
7 == !=
8 & (побітове и)
9 ^ (побітове виключне або)
10 | (побітове або)
11 && (логічне і)
12 || (не логічне або)
13 ?:
14 = += -= *= /= %= ^= |= <<= >>=
15 ,

5.5 Порозрядні операції

Порозрядні (побітові) операції виконуються тільки над операндами цілих типів. До


них належать:
& –побітове «і»
| – побітове «або»
^ – побітове виключне «або»
~ – побітове «не»
<< – зсування вліво
>> – зсування вправо

Три бінарні порозрядні операції, що визначаються знаками &, |, ^ та реалізують операції,


що відносяться до класу булевих, виконуються відповідно таблиці істинності (табл. 5.4).

Таблиця 5.4 – Значення порозрядних операцій


a b a&b a|b a^b
0 0 0 0 0
0 1 0 1 1
1 0 0 1 1
1 1 1 1 0

6&3=?
110
& 011
-------
010 –> 6&3=2
5.6 Вирази

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


значення. Вираз формується з послідовності операцій, операндами яких можуть бути
змінні, константи, виклик функції.
Послідовність виконання операцій у виразах визначається правилами пріоритету:
− операнд, який знаходиться між двома операціями з різними пріоритетами
зв'язується з операцією, яка має вищий пріоритет;
− операнд, який знаходиться між двома операціями з рівним пріоритетом, зв'язується
з операцією, записаної зліва;
− вираз, взяте в дужки, обчислюється в першу чергу і далі розглядається, як окремий
операнд;
− операції з однаковими пріоритетами виконуються зліва направо.

Приклади виразів:
(a+0.15)/6 x && y || !z (t*sin(x)- 1.5)/(2*k+4)*(2*k+1)

Результат обчислення виразу характеризується значенням і типом. У вираз можуть


входити операнди різних типів, в цьому випадку перед обчисленнями виконується
перетворення типів за певними правилами: більш «короткі» типи даних перетворюються в
більш «довгі» для збереження точності і значущості: (int + int) -> int; (int + float) -> float і
т.п.
Програміст може задати перетворення типів явно: (<тип даних>) <вираз>.
Наприклад:
int a;
float b=8.6;
printf(“%lf %d”, (double) a, (int) b);

У виразах обчислювального характеру часто доводиться застосовувати


математичні функції. Мова С підтримує бібліотеку стандартних математичних функцій
<math.h>.
Перелік основних математичних функції наведено в табл. 5.5.

Таблиця 5.5 – Основні математичні функції бібліотеки <math.h>


Ім'я
Опис
функції
abs Повертає абсолютну величину цілого числа
acos арккосинус
asin арксинус
atan арктангенс
atan2 арктангенс з двома параметрами
ceil округлення до найближчого більшого цілого числа
cos косинус
cosh гіперболічний косинус
exp обчислення експоненти
fabs абсолютна величина (числа з плаваючою точкою)
floor округлення до найближчого меншого цілого числа
обчислення залишку від ділення без остачі для чисел з плаваючою
fmod
точкою
frexp розбиває число з плаваючою точкою на мантису і показник ступеня
ldexp множення числа з плаваючою точкою на цілу ступінь двох
log натуральний логарифм
log10 логарифм за основою 10
витягує цілу і дробову частини (з урахуванням знаку) з числа з
modf(x,p)
плаваючою точкою
pow(x,y) результат зведення x в ступінь y, xy
sin синус
sinh гіперболічний синус
sqrt квадратний корінь
tan тангенс

tanh гіперболічний тангенс

Контрольні питання:
1. Визначте поняття «літерал», «константа», «змінна», «вираз».
2. Особливості запису вісімкових та шістнадцятирічних констант.
3. Види арифметичних операції на мові С.
4. Порівняйте пріоритет операцій відношень та логічних операції.

You might also like