- •Обчислення виразів
- •Типи виразів
- •Арифметичні вирази, відношення, логічні, базові вирази
- •Приклади виразів
- •Використання та зміна значення виразів
- •Правила конструювання виразів
- •Суворо типізована мова
- •Зведення типів
- •Явне зведення типів
- •Неявне зведення типів
- •Уникнення суворої типізації
- •Існування та дія програмних об'єктів
- •Період існування та область дії
- •Нумерація, номер і глибина вкладеності блока
- •Блокова структура програми
- •Мембранний ефект.
- •Регулювання області дії блока
- •Регулювання періоду існування
- •Блокова структура програми
- •Глобальне розрізнення видимості позначень (імен)
- •Стратегії розподілу пам'яті
- •Стратегія статичного розподілу пам'яті
- •Стратегія динамічного розподілу пам'яті на основі блока
- •Стратегія динамічного розподілу пам'яті на основі блока (продовження)
- •Стратегія розподілу пам'яті в купі
- •Стратегія розподілу пам'яті в купі (продовження)
- •Динамічний розподіл пам'яті на основі купи (Pascal)
- •Динамічний розподіл пам'яті на основі купи (c)
- •Приклади утворення сміття
ініціалізуйте всі об'єкти виразу до моменту його виконання;
не використовуйте R-вираз в операторі присвоювання;
використовуйте дужки для явного зазначення порядку виконання операцій в складних виразах;
використовуйте пробіли в позначенні виразу, наприклад, по одному пробілу з обох боків від позначень операцій для кращого розуміння виразів;
розміщуйте довгі описи виразів на кількох рядках, розбиваючи їх на прості підвирази для кращого розуміння виразів.
Суворо типізована мова
Мова програмування є суворо типізованою (restricted type language) , якщо виконуються такі умови:
- кожний об'єкт у програмі пов’язується з багатьма значеннями одного типу через використання явного опису типу (виняток становить вираз);
- тип об'єкта є синтаксичною властивістю і, тому його можна визначити, не виконуючи програми;
- перетворення типу здійснюється шляхом перетворення значення одного типу в іншій, і це перетворення зазначається у програмі явно;
- неявні перетворення шляхом інтерпретації подання значення одного типу значенням іншого типу заборонені.
Приклад на мові С
int nV;
char cV;
nV = 1;
cV = ‘A’;
nV = nV + cV; - успішно відкомпільований код
Приклад на мові Pascal
var
nV : integer;
cV : char;
begin|
nV : = 1;
cV : = 'A';
nV : = nV + cV; - код не компілюється
Зведення типів
Зведення типів (coercion casting types) – це перетворення значень одного типу до значень іншого типу.
Зведення може виконуватись як на наперед визначених, так і на визначуваних типах.
Розрізняють явне і неявне зведення типів. У суворо типізованих мовах дозволене тільки явне зведення типів. Якщо у суворо типізованій мові, потрібне неявне зведення типів, то для цього використовуються механізми уникнення суворої типізації.
Явне зведення типів
Явне зведення типів (explicit casting types) може використовуватися як у суворо, так і не суворо типізованих мовах.
Для явного зведення типів використовується кваліфікація виразу індикатором типу, наприклад, таким чином T(E), де Т - це індикатор типу, до якого необхідно звести значення; Е - вираз, що позначає значення, яке необхідно привести до типу Т. Наприклад, char(65) або int(‘A’), тут Т це char, int, а E це 65, ‘A’.
у мові Pascal:
var
nA : integer;
cB : char;
begin
cB : = ‘a’;
nA : = integer(cB);
end.
у мові С:
{
int nB;
float fA;
fA = 267.7;
nB = (int)fA;
}
Неявне зведення типів
Неявне зведення типів (implicit casting types) – це автоматичне зведення значень одного типу в значення іншого типу за правилами, передбаченими реалізацією мови.
Ці правила необхідно знати навіть в тому разі, коли програміст не використовує неявних зведень, оскільки вони можуть застосовуватися в тих конструкціях, які програміст бере готовими. Тому неявне зведення – це мовно-залежний механізм, застосування якого різко знижує мобільність програм.
У мові Pascal:
var
fA : real;
nB| : integer;
begin
nB : = 3248;
fA : = nB;
end.
У мові С:
{
float fA;
int nB;
nB = 253;
fA = nB;
}
Приклади правил неявних зведень в мові Сі
Вид типу |
До типу |
Дії |
Char |
short |
доповнення знаком; |
Char |
long |
доповнення знаком; |
Char |
unsigned char |
збереження побітового уявлення; старший біт втрачає функцію знакового біта |
long |
float |
представляється як float; можлива деяка втрата точності |
long |
double |
представляється як double; можлива деяка втрата точності |
unsigned char |
char |
збереження побітового уявлення; старший біт стає знаком |
