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