програмах мови Паскаль (та інших мов високого рівня) змінні позначаються іменами, або ідентифікаторами. Імена можна вибирати будь-які, крім службових слів. Наприклад, ABRACADABRA, temperature, number, f1234qq тощо. У багатьох діалектах імена різняться тільки по перших восьми символах, наприклад, імена abcdefgh1 і abcdefgh2 невідрізнювані.
Змінна величина у математиці вважається заданою, якщо визначено множину значень, які вона може приймати. У Паскаль-програмі змінна задається означенням, де записується її ім'я й тип:
var ім'я : ім'я типу;
наприклад,
var temperature : integer;
або
var even : boolean;
Ключове слово var є скороченням англійського variable – змінна). Кілька однотипних змінних можна означити разом, указавши їх імена через кому:
var a, b, c: integer;
Тип змінної задає множину її можливих значень, і операції, застосовні до них. Наприклад, цілі значення змінної temperature можна до чогось додавати або від чогось віднімати, а до значень змінної even можна застосовувати операцію заперечення, але не навпаки.
Кожна ділянка пам'яті має в комп'ютері щось на зразок номера – адресу. Саме адресою вказується ділянка пам'яті в машинній програмі. Ім'я змінної, записане в Паскаль-програмі, в результаті трансляції перетворюється на адресу деякої ділянки пам'яті програми. При виконанні програми ця ділянка і є тією змінною, чиє ім'я записано в програмі. Ми кажемо, що ім'я змінної вказує, або посилається на ділянку пам'яті під час виконання програми, або що ділянку поставлено у відповідність імені (рис.2.2).
Проте поки незрозуміло, звідки в змінних беруться значення. Зараз дізнаємося.
3.2. Оператор присвоювання
Оператор присвоювання має вигляд:
ім'я змінної := вираз
(знак присвоювання ":=" – це лексема, яку не слід плутати зі знаком порівняння "="). Оператор присвоювання позначає:
1) обчислити значення виразу, записаного праворуч;
2) записати це значення в змінну, позначену ім'ям.
Отже, описані дії є семантикою оператора присвоювання.
Приклад. Якщо ім'я z означено як var z : integer, то оператор присвоювання z:=11*(10+1) позначає обчислення значення 121 і запис його в змінну з ім'ям z. Після його виконання змінна з ім'ям z має значення 121.?
Пара вигляду (ім'я, значення) називається станом змінної, наприклад, (z,121) – стан змінної z після виконання оператора присвоювання. Таким чином, після присвоювання змінній нового значення її стан змінюється.
Оператори присвоювання (і не тільки вони) в програмі записуються один за одним і відокремлюються роздільником ";", наприклад, z:=1; t:=2 (звичайно, за умови, що z і t означено як імена змінних типу integer). Оператори, записані один за одним, утворюють послідовність операторів. Кожен з них задає зміну стану хоча б однієї зі змінних.
Сукупність змінних, чиї імена означено в програмі, називається пам'яттю програми. Сукупність станів змінних називається станом пам'яті програми. Зміна стану однієї зі змінних змінює стан пам'яті програми, тому оператор присвоювання задає зміну стану пам'яті програми. Далі ми розглянемо інші види операторів, але
всі оператори задають зміну станів пам'яті програми. Ця зміна і є їхньою семантикою.
Виконання операторів програми можна проімітувати, указавши їх послідовність і послідовність станів пам'яті програми, що утворюються в результаті їх виконання. Якщо в процесі виконання програми змінна ще не одержала значення, то воно вважається невизначеним і позначається "?". Наприклад, ось програма та подання її імітації:
виконуваний оператор | стан пам'яті
x | y | z
? | ? | ?
z := 1 | ? | ? | 1
x := 3 | 3 | ? | 1
y := 15 | 3 | 15 | 1
x := 10 | 10 | 15 | 1
program a2(input, output);
var x, y, z : integer;
begin
z := 1;
x := 3;
y := 15;
x := 10
end.
Звернімо увагу на те, що нові значення змінних записуються замість старих.
3.3. Вирази з іменами
Імена змінних, присвоювання значень яким задано в попередніх операторах програми, можна записувати у виразах. Значенням виразу, складеного лише ім'ям змінної, є значення цієї змінної, присвоєне їй раніш. Наприклад, якщо змінна з ім'ям z має значення 2, то вираз z+1 задає додавання 2 і 1; значенням виразу буде 3. При іншому значенні z вираз z+1 мав би інше значення. Породження значення змінної за її ім'ям називається її розіменуванням.
Приклад. Послідовність операторів z:=2; z:=z+1 задає присвоювання змінній z спочатку 2, а потім обчислення 2+1 і присвоювання 3 цій же змінній. Сам по собі оператор z:=z+1 задає збільшення значення змінної з ім'ям z на 1, яким би це значення не було (аби воно було присвоєно).?
Отже, ім'я змінної у виразі задає її значення в момент обчислення виразу. Тому ми кажемо, що вираз обчислюється при поточних значеннях вказаних у ньому змінних, або на поточному стані пам'яті. Наприклад, послідовності операторів x:=2; z:=x+1 і x:=5; z:=x+1 задають присвоювання різних значень (3 і 6) змінній z у результаті виконання того самого оператора z:=x+1.
Крім імен змінних, у виразах можна записувати іменовані сталі. Вони також розіменовуються, наприклад, якщо означено const cc=169, то вираз cc-25 має значення 144. Зазначимо, що він обчислюється в процесі трансляції програми.
Задачі
2.6.* Нехай a, b, c, ... – імена цілих змінних. Написати арифметичний вираз, значенням якого є:
а) більше з двох значень a і b;
б) значення останньої цифри в десятковому поданні a, наприклад, при a=789 це 9;
в) сума значень цифр двозначного a, наприклад, при a=83 це 11;
г) сума значень цифр тризначного a, наприклад, при a=123 це 6.
2.7.* Нехай a, b, c, … – імена цілих змінних із додатними значеннями. Написати булів вираз, значенням якого є true тоді й тільки тоді, коли:
а) a, b, c мають однакові