Значення (інформатика)

Матеріал з Вікіпедії — вільної енциклопедії.
Версія від 03:54, 8 листопада 2021, створена TohaomgBot (обговорення | внесок) (Згруповано однакові примітки)
Перейти до навігації Перейти до пошуку

Значення в програмуванні  - елемент даних, який є одним з можливих членів типу даних[1]: воно може бути числом, символом або рядком символів. Значення може відповідати деякому стану величини (змінної або константи відповідного типу). Наприклад, 2 - значення цілочисельного типу.

У мовах з можливістю присвоювання значень змінним виникає необхідність розрізняти r-значення (r-value - зміст) і l-значення (l-value - місце розташування) змінної[1].

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

l-значення і r-значення

Ідея l-значень і r-значень походить з мов програмування з операторами присвоювання, в яких для значень зліва (left) і праворуч (right) від оператора використовується різний режим обчислення. l-значення вказує на об'єкт, який зберігається за межами одного виразу, r-значення - це тимчасове значення, яке не зберігається за межами виразу, який його використовує[2]. Поняття l-значення і r-значення були введені в мові CPL.

У багатьох мовах програмування, особливо в родині С-подібних, l-значення мають адреси зберігання, які програмно доступні виконуваній програмі (наприклад, використовуючи оператор адресації «&» в C/C++). Це означає що l-значення є змінною або розіменованим посиланнями на певні області пам'яті.

Протилежністю l-значенню є r-значення, яке не має постійної адреси в пам'яті. Прикладами можуть бути окремі числа або вирази, значення яких обчислюється під час виконання програми і надається деякій змінній.

У C++ всі змінні є l-значеннями, оскільки вони мають адреси в пам'яті, r-значення можуть бути l-значеннями або не-l-значеннями (безпосереднє значення, яке не має адреси у пам'яті). Для прикладу візьмемо вираз 4 + 9у мові програмування С++. Під час виконання програма генерує значення 13, але оскільки в програмі не вказано, де міститься результат опрацювання, вираз є не l-значенням. З іншого боку, якщо в С-програмі оголошується змінна x, якій присвоюється значення 13, то виразx має значення 13 і є l-значенням.

Незмінюване (константне) l-значення має адресу, але не може бути змінено. На відміну від нього, змінюване l-значення дозволяє не тільки отримувати значення, пов'язане з об'єктом, але і надавати йому інше значення.

Спочатку термін l-значення позначав в мові програмування С об'єкт, якому можна надавати значення, звідси і назва, що вказує, що воно знаходить ліворуч (left) від оператора присвоювання, проте з тих пір, як в мову було додано зарезервоване слово const(константа ), термін тепер звучить як «змінюване l-значення». У C ++ 11 існує спеціальний семантичний гліф &&, який вказує «використовувати адресу вирази тільки компілятору»; тобто адреса значення не може бути розрахована оператором &під час виконання програми.

Приклади операцій присвоювання з використанням r-значень:

int a; // оголошуємо змінну a
a = 5; // 5 обчислюється в 5, яке потім присвоюється змінній а
a = 4 + 6; // 4 + 6 обчислюється в 10, яке потім присвоюється змінній а
int b; // оголошуємо змінну b
b = a; // a обчислюється в 10 (з попередніх операцій), яке потім присвоюється змінній b
b = b; // b обчислюється в 10, яке потім присвоюється змінній b (нічого не відбувається)
b = b + 2; // b + 2 обчислюється в 12, яке потім присвоюється змінній b

В останній операцію присвоювання ( b = b + 2; ) змінна b використовується в двох різних контекстах - ліворуч b використовується як l-значення (змінна з адресою в пам'яті), праворуч b використовується як r-значення і обчислює окреме значення (в даному випадку 12). При виконанні цієї операції, компілятор обчислить наступне:

b = 10 + 2;

Обчислене значення буде надано змінній b.

В лівій стороні операції присвоювання завжди має перебувати l-значення (яке має свою адресу в пам'яті), а в правій стороні операції присвоювання - r-значення (яке обчислює деяке значення).

Примітки

  1. а б Mitchell, John C. (1996). Foundations for programming languages. Cambridge, Mass.: MIT Press. ISBN 0-262-13321-0. OCLC 33277643.
  2. Lvalues and Rvalues (Visual C++). MSDN.

Література:

  • John C. Mitchell. Foundations for Programming Languages. — The MIT Press, 1996. — ISBN 0-262-13321-0.
  • Christopher Strachey. Fundamental Concepts in Programming Languages. — 2000. — Т. 13. — С. 11—49. — doi:10.1023/A:1010000313106.