Στο Θέμα 3, ε) είναι:
Μπορεί ένας C++ μεταφραστής (compiler) να γραφτεί σε C;
Σαφέστατα.
Υπάρχουν προγράμματα τα οποία μπορούν να γραφτούν σε C++ αλλά όχι σε C;
Η ερώτηση δεν είναι απόλυτα σαφής. Πρόγραμμα θεωρείται κάτι που έχει ήδη γραφτεί οπότε ...
Δεν υπάρχουν, όμως, αλγοριθμικά προβλήματα που να μπορούν να λυθούν με χρήση της C++ και όχι της C.
Υπάρχει όμως περίπτωση να
πρέπει να χρησιμοποιηθεί C++ (και όχι C) για την υλοποίηση όταν υπάρχουν περιορισμοί σε κάποιο underlying framework, πχ το API που πρέπει να χρησιμοποιηθεί χρησιμοποιεί class.
Θέμα 1, α)
Προβλέψτε την έξοδο ή το λάθος για τα παρακάτω.
Υπάρχει συντακτικό λάθος στη δεύτερη γραμμή. Δε γίνεται να αυξήσει κανείς την τιμή μιας const μεταβλητής.
Η (*p) είναι const επειδή η δήλωση στην πρώτη γραμμή λέει "δηλώνω δείκτη με όνομα p που δείχνει σε έναν const integer (***), ο οποίος είναι alias του (*p)", άρα είναι παράτυπη η αλλαγή της τιμής του ακεραίου.
Επίσης η δήλωση στην πρώτη γραμμή είναι λάθος επειδή το δεξιά μέρος (δηλαδή το "5") είναι int ενώ ο τύπος στα αριστερά είναι int *. Θα πρέπει να γίνει το κατάλληλο cast, πχ const int * p = (int *)5;
Ακόμη και τώρα όμως το πρόγραμμα εξακολουθεί να έχει λάθος. Ορίζω έναν δείκτη μιας const μεταβλητής και τον αρχικοποιώ με ένα hardcoded αριθμό (τον 5). Το αποτέλεσμα είναι ο δείκτης να μη δείχνει πουθενά ή να δείχνει σε μια περιοχή στην εικονική μνήμη που δεν υπάρχει ή που δεν έχει δικαίωμα η εφαρμογή να προσπελάσει ή χίλια δυο άλλα. Με λίγα λόγια, ακόμη και το πρόγραμμα
- Κώδικας: Επιλογή όλων
const int *p = (int *)5;
cout << *p;
δεν πρόκειται ποτέ να τρέξει χωρίς exception/fatal error, αν και κατά πάσα πιθανότατα θα περάσει τον compiler.
Εν ολίγοις υπάρχουν τρία λάθη.
*** Η παραπάνω έκφραση δεν είναι 100% σωστή. Ο ακέραιος στον οποίο δείχνει ο p θεωρείται const μόνον όταν αυτός προσεγγίζεται μέσω του p αλλά αυτό δεν αλλάζει κάτι στην περίπτωσή μας.