Значення (інформатика)
Значення в програмуванні - елемент даних, який є одним з можливих членів типу даних[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-значення (яке обчислює деяке значення).
Примітки
- Mitchell, John C. (1996). Foundations for programming languages. Cambridge, Mass.: MIT Press. ISBN 0-262-13321-0. OCLC 33277643.
- 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.