Στον προγραμματισμό υπολογιστών μια **τιμή** (Αγγλικά: *value*) είναι μια έκφραση (Αγγλικά: *expression*) η οποία δεν μπορεί να αποτιμηθεί σε άλλη τιμή. Για παράδειγμα η έκφραση `3+4` δεν είναι τιμή αφού μπορεί να αποτιμηθεί στην έκφραση `7` η οποία στην συνέχεια δεν μπορεί να αποτιμηθεί σε κάτι άλλο.  Η κάθε τιμή συνήθως ανήκει σε κάποιο τύπο (Αγγλικά: *type*) (ένας τύπος είναι μια συλλογή από τιμές και μια τιμή είναι μέλος αυτής της συλλογής).

l-values και r-values
---------------------

Σε κάποιες γλώσσες προγραμματισμού χρησιμοποιείται η ιδέα των **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*.  Γενικά *l-value* αναφέρεται σε μια έκφραση η οποία αποθηκεύεται / διατηρείται σε αντίθεση με την *r-value* που είναι μια τιμή η οποία αποτιμάται προσωρινά. Γενικά οι μεταβλητές ακόμη και οι σταθερές είναι *l-values*.  

### Παράδειγμα

Στο παρακάτω παράδειγμα στην γλώσσα προγραμματισμού 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` (αριστερά του τελεστή `=`). 

```
#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; 
}

```

Παραπομπές
----------

1. ↑  John C. Mitchell (1996). *Foundations of computing*. MIT Press. σελ. 92. ISBN 9780262133210.
2. ↑  John C. Mitchell (1996). *Foundations of computing*. MIT Press. σελ. 9. ISBN 9780262133210.
3. ↑  Γιάννης Γαροφαλάκης. «Μεταβλητές - Εκφράσεις - Εντολές» (PDF). Τμήμα Ηλεκτρολόγων Μηχανικών Μηχανικών Υπολογιστών Πανεπιστημίου Πατρών. Αρχειοθετήθηκε από το πρωτότυπο (PDF) στις 5 Μαρτίου 2016. Ανακτήθηκε στις 20 Δεκεμβρίου 2014.
4. 1 2  «Lvalues and Rvalues». microsoft.com. Ανακτήθηκε στις 20 Δεκεμβρίου 2014.
5. ↑  Thomas Becker (Μάρτιος 2013). «C++ Rvalue References Explained». thbecker.net. Ανακτήθηκε στις 20 Δεκεμβρίου 2014.