Τιμή (προγραμματισμός υπολογιστών)

Στον προγραμματισμό υπολογιστών μια τιμή (Αγγλικά: 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; 
}

 Παραπομπές 

Τιμη