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

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

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

Παράδειγμα

Επεξεργασία

Στο παρακάτω παράδειγμα στην γλώσσα προγραμματισμού 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]

#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. 4,0 4,1 «Lvalues and Rvalues». microsoft.com. Ανακτήθηκε στις 20 Δεκεμβρίου 2014. 
  5. Thomas Becker (Μάρτιος 2013). «C++ Rvalue References Explained». thbecker.net. Ανακτήθηκε στις 20 Δεκεμβρίου 2014.