Στον προγραμματισμό υπολογιστών μια τιμή (Αγγλικά: value) είναι μια έκφραση (Αγγλικά: expression) η οποία δεν μπορεί να αποτιμηθεί σε άλλη τιμή. Για παράδειγμα η έκφραση 3+4 δεν είναι τιμή αφού μπορεί να αποτιμηθεί στην έκφραση 7 η οποία στην συνέχεια δεν μπορεί να αποτιμηθεί σε κάτι άλλο. [1] Η κάθε τιμή συνήθως ανήκει σε κάποιο τύπο (Αγγλικά: type) (ένας τύπος είναι μια συλλογή από τιμές και μια τιμή είναι μέλος αυτής της συλλογής). [2]
3+4
7
Σε κάποιες γλώσσες προγραμματισμού χρησιμοποιείται η ιδέα των l-values (left-value/αριστερές-τιμές) και r-values (right-value/δεξιές τιμές). Οι τιμές που είναι l-values έχουν μια διεύθυνση μνήμης την οποία ο προγραμματιστής μπορεί να την προσπελάσει κατά την εκτέλεση του προγράμματος. Για παράδειγμα στην γλώσσα προγραμματισμού C/C++ με τον τελεστή διεύθυνσης & παίρνουμε την τιμή της διεύθυνσης μνήμης όπου βρίσκεται η l-value. Αυτό σημαίνει ότι οι τιμές l-value μπορούν να αποτιμηθούν σε συγκεκριμένες διευθύνσεις μνήμης. Έστω ότι έχουμε την έκφραση x = x + 1. Η x αριστερά του = είναι l-value ενώ η x δεξιά του = είναι r-value. Στην x δεξιά του = (r-value) γίνεται αποαναφόριση (Αγγλικά: dereferencing). Αποαναφόριση σημαίνει παίρνουμε την τιμή που δείχνει η διεύθυνση μνήμης της x (τελεστής * στην C/C++). Στην τιμή του x προσθέτουμε το 1 και το αποτέλεσμα το αποθηκεύουμε στην θέση μνήμης που δείχνει η l-value (η οποία είναι αναφορά/reference στε θέση μνήμης). Ο τελεστής ανάθεσης = στην πράξη παίρνει δύο ορίσματα, την τιμή r-value και την αναφορά (Αγγλικά: reference) / θέση μνήμης) l-value. [3] Γενικά l-value αναφέρεται σε μια έκφραση η οποία αποθηκεύεται / διατηρείται σε αντίθεση με την r-value που είναι μια τιμή η οποία αποτιμάται προσωρινά. Γενικά οι μεταβλητές ακόμη και οι σταθερές είναι l-values. [4] [5]
&
x = x + 1
x
=
Στο παρακάτω παράδειγμα στην γλώσσα προγραμματισμού C++ η μεταβλητή x στο int x = 5 + 3; είναι l-value που σημαίνει ότι διατηρείται στην μνήμη σε αντίθεση με την έκφραση 5+3 η οποία αποτιμάται προσωρινά πριν αυτή αποθηκευτεί στην x. Στην έκφραση x = x + 1; η μεταβλητή x δεξιά του = είναι l-value ενώ δεξιά του = r-value. Η r-value έκφραση x + 1 αποτιμάται προσωρινά όπως περιγράψαμε και παραπάνω σε 8+1 και η τελική τιμή 9 αποθηκεύεται στην l-value του x (αριστερά του τελεστή =). [4]
int x = 5 + 3;
5+3
x = x + 1;
x + 1
8+1
9
#include <iostream> int main(){ int x = 5 + 3; std::cout << x << std::endl; x = x + 1; std::cout << x << std::endl; }
Παραδείγματα σφαλμάτων σε εκφράσεις με λάθος l-values:
int main() { int k, *p; // Σωστό: η μεταβλητή i είναι lvalue. k = 10; // Σφάλμα: αριστερά του τελεστή = δεν έχουν lvalue 5 = k; // ΣΦΑΛΜΑ k * 3 = 4; // ΣΦΑΛΜΑ // Σωστό: αποαναφόριση δείκτη σε lvalue. *p = k; }