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

Από τη Βικιπαίδεια, την ελεύθερη εγκυκλοπαίδεια
Πήδηση στην πλοήγηση Πήδηση στην αναζήτηση

Στον προγραμματισμό υπολογιστών μια τιμή (Αγγλικά: 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+3 και η τελική τιμή 11 αποθηκεύεται στην 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. http://mitpress.mit.edu/books/foundations-programming-languages. 
  2. John C. Mitchell (1996). Foundations of computing. MIT Press, σελ. 9. ISBN 9780262133210. http://mitpress.mit.edu/books/foundations-programming-languages. 
  3. Γιάννης Γαροφαλάκης. «Μεταβλητές - Εκφράσεις - Εντολές». Τμήμα Ηλεκτρολόγων Μηχανικών Μηχανικών Υπολογιστών Πανεπιστημίου Πατρών. http://athos.cti.gr/arxes_glwsswn/Slides4_Variables_11.pdf. Ανακτήθηκε στις 20 Δεκεκεμβρίου 2014. 
  4. 4,0 4,1 «Lvalues and Rvalues». microsoft.com. http://msdn.microsoft.com/en-us/library/f90831hc.aspx. Ανακτήθηκε στις 20 Δεκεμβρίου 2014. 
  5. Thomas Becker (Μάρτιος 2013). «C++ Rvalue References Explained». thbecker.net. http://thbecker.net/articles/rvalue_references/section_01.html. Ανακτήθηκε στις 20 Δεκεμβρίου 2014.