Κυριακή 13 Νοεμβρίου 2011

Τεχνικές σχεδίασης προγραμμάτων

[πηγή]


Ιεραρχική σχεδίαση προγράμματος
Η τεχνική της ιεραρχικής σχεδίασης και επίλυσης ή η διαδικασία σχεδίασης «από επάνω προς τα κάτω» όπως συχνά ονομάζεται (top-down program design) περιλαμβάνει τον καθορισμό των βασικών λειτουργιών ενός προγράμματος, σε ανώτερο επίπεδο, και στη συνέχεια τη διάσπαση των λειτουργιών αυτών σε όλο και μικρότερες λειτουργίες, μέχρι το τελευταίο επίπεδο που οι λειτουργίες είναι πολύ απλές, ώστε να επιλυθούν εύκολα.
Σκοπός της ιεραρχικής σχεδίασης είναι η διάσπαση λοιπόν του προβλήματος σε μια σειρά από απλούστερα υποπροβλήματα, τα οποία να είναι εύκολο να επιλυθούν οδηγώντας στην επίλυση του αρχικού προβλήματος.
Τμηματικός προγραμματισμός
Η ιεραρχική σχεδίαση προγράμματος υλοποιείται με τον τμηματικό προγραμματισμό. Μετά την ανάλυση του προβλήματος σε αντίστοιχα υποπροβλήματα αποτελεί ανεξάρτητη ενότητα (module) που γράφεται ξεχωριστά από τα υπόλοιπα τμήματα προγράμματος.
Ο τμηματικός προγραμματισμός διευκολύνει τη δημιουργία προγράμματος, μειώνει τα λάθη και επιτρέπει ευκολότερη παρακολούθηση, κατανόηση και συντήρηση του προγράμματος από τρίτους.
Δομημένος προγραμματισμός
Ο δομημένος προγραμματισμός παρουσιάστηκε στα μέσα του 60. Δεν είναι απλώς ένα είδος προγραμματισμού, είναι μια μεθοδολογία σύνταξης προγραμμάτων που έχει σκοπό να βοηθήσει τον προγραμματιστή στην ανάπτυξη σύνθετων προγραμμάτων, να μειώσει τα λάθη, να εξασφαλίσει την εύκολη κατανόηση των προγραμμάτων και να διευκολύνει τις διορθώσεις και τις αλλαγές σ’ αυτά.
Ο δομημένος προγραμματισμός στηρίζεται στη χρήση τριών και μόνο στοιχειωδών λογικών δομών, τη δομή της ακολουθίας, τη δομή της επιλογής και τη δομή της επανάληψης. Όλα τα προγράμματα μπορούν να γραφούν χρησιμοποιώντας μόνο αυτές τις τρεις δομές καθώς και συνδυασμό τους. Κάθε πρόγραμμα όπως και κάθε ενότητα προγράμματος έχει μόνο μια είσοδο και μόνο μια έξοδο.
Ο δομημένος προγραμματισμός ενθαρρύνει και βοηθάει την ανάλυση του προγράμματος σε επί μέρους τμήματα, έτσι ώστε σήμερα ο όρος δομημένος προγραμματισμός περιέχει τόσο την ιεραρχική σχεδίαση όσο και τον τμηματικό προγραμματισμό.
Πλεονεκτήματα του δομημένου προγραμματισμού
Επιγραμματικά μπορούμε να αναφέρουμε τα εξής πλεονεκτήματα του δομημένου προγραμματισμού
  •  Δημιουργία απλούστερων προγραμμάτων  
  • Άμεση μεταφορά των αλγορίθμων σε προγράμματα
  • Διευκόλυνση ανάλυσης του προγράμματος σε τμήματα
  • Περιορισμός των λαθών κατά την ανάπτυξη του προγράμματος
  • Διευκόλυνση στην ανάγνωση και κατανόηση του προγράμματος από τρίτους
  • Ευκολότερη διόρθωση και συντήρηση

Ταξινόμηση γλωσσών προγραμματισμού

[πηγή]


Όλες οι γλώσσες προγραμματισμού που έχουν αναπτυχθεί μέχρι σήμερα, αντιπροσωπεύουν διάφορες ιδέες πάνω στον προγραμματισμό και η κάθε μία είναι συνήθως καλύτερα προσαρμοσμένη σε ορισμένες κατηγορίες προβλημάτων. Η μεγάλη πλειοψηφία των γλωσσών ανήκει στην κατηγορία των διαδικασιακών (procedural) γλωσσών. Είναι γνωστές επίσης και ως αλγοριθμικές γλώσσες, γιατί είναι σχεδιασμένες για να επιτρέπουν την υλοποίηση αλγορίθμων. Άλλες κατηγορίες γλωσσών υψηλού επιπέδου είναι:
  • Αντικειμενοστραφείς γλώσσες (object-oriented languages).
  • Συναρτησιακές γλώσσες (functional languages) π.χ LISP.
  • Μη διαδικασιακές γλώσσες (non procedural languages) π.χ PROLOG. Χαρακτηρίζονται επίσης ως γλώσσες πολύ υψηλού επιπέδου.
  • Γλώσσες ερωταπαντήσεων (query languages) π.χ SQL.
Μια άλλη ταξινόμηση που μπορεί να προκύψει με βάση την περιοχή χρήσης. Με αυτό το κριτήριο διακρίνουμε:
  • Γλώσσες γενικής χρήσης. Θεωρητικά κάθε γλώσσα γενικής χρήσης μπορεί να χρησιμοποιηθεί για την επίλυση οποιουδήποτε προβλήματος. Στην πράξη ωστόσο κάθε γλώσσα έχει σχεδιαστεί για να ανταποκρίνεται καλύτερα σε ορισμένη κατηγορία προβλημάτων
  1.    Γλώσσες επιστημονικής κατεύθυνσης (science oriented languages) π.χ FORTRAN
  2.     Γλώσσες εμπορικής κατεύθυνσης (business-oriented language) π.χ COBOL
Ας σημειωθεί ότι ορισμένες γλώσσες  τα καταφέρνουν εξίσου καλά και στους δυο προηγούμενους τομείς π.χ BASIC, Pascal
  1. Γλώσσες προγραμματισμού συστημάτων (system programming languages) π.χ C.
  2. Γλώσσες τεχνητής νοημοσύνης (artificial intelligence languages) π.χ LISP, PROLOG  
  •  Γλώσσες ειδικής χρήσης. Πρόκειται για γλώσσες που χρησιμοποιούνται σε ειδικές περιοχές εφαρμογών όπως π.χ στα γραφικά με υπολογιστή, στη ρομποτική, στη σχεδίαση ολοκληρωμένων κυκλωμάτων, στα Συστήματα Διοίκησης Βάσεων Δεδομένων, στην εκπαίδευση μέσο υπολογιστή κ.α.

Ιστορική αναδρομή του προγραμματισμού

αναδημοσιέυω από ΕΔΩ:


Ιστορική αναδρομή
Γλώσσες μηχανής
Αρχικά για να μπορέσει ο υπολογιστής να εκτελέσει μία οποιαδήποτε λειτουργία, έπρεπε να δοθούν κατευθείαν οι κατάλληλες ακολουθίες από 0 και 1, δηλαδή εντολές σε μορφή κατανοητή από τον υπολογιστή αλλά πολύ δύσκολα κατανοητές από τον άνθρωπο. Ο τρόπος αυτός ήταν επίπονος και ελάχιστοι μπορούσαν να τον υλοποιήσουν, αφού απαιτούσε βαθιά γνώση του υλικού και της αρχιτεκτονικής του υπολογιστή.
Οι εντολές που δέχεται ένας υπολογιστής μετατρέπονται σε ακολουθίες που αποτελούνται από 0 και 1, γίνονται δηλαδή εντολές σε γλώσσα μηχανής  όπως ονομάζονται, έτσι ώστε να γίνουν κατανοητές από τον υπολογιστή και στη συνέχεια να μπορέσει να τις εκτελέσει.
  Συμβολικές γλώσσες ή γλώσσες χαμηλού επιπέδου
Από τα πρώτα χρόνια άρχισαν να γίνονται προσπάθειες για τη δημιουργία μιας συμβολικής γλώσσας, η οποία ενώ θα έχει έννοια για τον άνθρωπο θα μετατρέπεται εσωτερικά από τους υπολογιστές στις αντίστοιχες ακολουθίες από 0 και 1. Για παράδειγμα η λέξη ADD (πρόσθεσε) ακολουθούμενη από δυο αριθμούς, είναι κατανοητή από τον άνθρωπο και απομνημονεύεται σχετικά εύκολα. Η εντολή αυτή θα μεταφραστεί από τον υπολογιστή σε μία ακολουθία δυαδικών ψηφίων και στη συνέχεια μπορεί να εκτελεστεί. Το έργο της μετάφρασης το αναλαμβάνει ένα ειδικό πρόγραμμα, ο συμβολομεταφραστής (assembler).
Γλώσσες υψηλού επιπέδου
Οι ανεπάρκειες των συμβολικών γλωσσών και η προσπάθεια για καλύτερη επικοινωνία ανθρώπου μηχανής οδήγησαν στα τέλη της δεκαετίας του 50 στην εμφάνιση των πρώτων γλωσσών προγραμματισμού υψηλού επιπέδου.
Το 1957 η IBM ανάπτυξε την πρώτη γλώσσα υψηλού επιπέδου τη FORTRAN. Το όνομα FORTRAN προέρχεται από τις λέξεις FORmula TRANslation που σημαίνουν μετάφραση τύπων. Η FORTRAN αναπτύχθηκε ως γλώσσα κατάλληλη για την επίλυση μαθηματικών και επιστημονικών προβλημάτων.
Το 1960 αναπτύχθηκε μία άλλη γλώσσα, σταθμός στον προγραμματισμό η γλώσσα COBOL. Η COBOL όπως δηλώνει και το όνομα της (COmmon Business Oriented Language-Κοινή γλώσσα προσανατολισμένη στις επιχειρήσεις) είναι κατάλληλη για ανάπτυξη εμπορικών εφαρμογών, και γενικότερα διαχειριστικών εφαρμογών, τομέας όπου η FORTRAN υστερούσε.
Μια από τις σημαντικότερες γλώσσα προγραμματισμού με ελάχιστη πρακτική εφαρμογή αλλά που επηρέασε ιδιαίτερα τον προγραμματισμό και τις επόμενες γλώσσες είναι η ALGOL (Algorithmic Language-Αλγοριθμική γλώσσα).
Στο χώρο της Τεχνητής Νοημοσύνης αναπτύχθηκαν δυο γλώσσες διαφορετικές από τις άλλες. Στα μέσα του 60 αναπτύχθηκε η LISP (LISt Processor- Επεξεργαστής λίστας), γλώσσα η οποία προσανατολίζεται σε χειρισμό λιστών από τα σύμβολα και η PROLOG (PROgramming LOGic- Λογικός Προγραμματισμός) στις αρχές του 70.
Δύο σημαντικότατες γλώσσες γενικού σκοπού, οι οποίες αναπτύχθηκαν τη δεκαετία του 60 αλλά χρησιμοποιούνται πάρα πολύ στις ημέρες μας, είναι η BASIC και η PASCAL.
Η γλώσσα προγραμματισμού BASIC (Beginners All Purpose Symbolic Code- Συμβολικός Κώδικας Εντολών Γενικής Χρήσης για Αρχάριους) αρχικά αναπτύχθηκε, όπως δηλώνει και το όνομα της, ως γλώσσα για την εκπαίδευση αρχαρίων στον προγραμματισμό. Σχεδιάστηκε για να γράφονται σύντομα προγράμματα, τα οποία εκτελούνται με τη βοήθεια διερμηνευτή (interpreter).
Η γλώσσα PASCAL έφερε μεγάλες αλλαγές στον προγραμματισμό. Παρουσιάστηκε το 1970 και στηρίχθηκε πάνω στην ALGOL. Είναι μια γλώσσα γενικής χρήσης, η οποία είναι κατάλληλη τόσο για την εκπαίδευση όσο και τη δημιουργία ισχυρών προγραμμάτων κάθε τύπου. Χαρακτηριστικό της γλώσσας είναι η καταλληλότητα για τη δημιουργία δομημένων προγραμμάτων.
Μία ακόμη γλώσσα που γνώρισε μεγάλη διάδοση είναι η γλώσσα C. Η C χρησιμοποιήθηκε για την ανάπτυξη του λειτουργικού συστήματος Unix γλώσσα με ισχυρά χαρακτηριστικά, μερικά από αυτά κοινά με την Pascal κατάλληλη για την ανάπτυξη δομημένων εφαρμογών αλλά και με πολλές δυνατότητες γλώσσας χαμηλού επιπέδου. Η C εξελίχτηκε στη γλώσσα C++, που είναι αντικειμενοστραφής.
Τα τελευταία χρόνια χρησιμοποιείται ιδιαίτερα, ειδικά για προγραμματισμό στο Διαδίκτυο (Internet), η JAVA. Η JAVA είναι μια αντικειμενοστραφής γλώσσα που αναπτύχθηκε από την εταιρία SUN με σκοπό την ανάπτυξη εφαρμογών, που θα εκτελούνται σε κατανεμημένα περιβάλλοντα, δηλαδή σε διαφορετικούς υπολογιστές οι οποίοι είναι συνδεδεμένοι με το Διαδίκτυο.
  Πλεονεκτήματα των γλωσσών υψηλού επιπέδου
Στα πλεονεκτήματα των γλωσσών προγραμματισμού υψηλού επιπέδου σε σχέση με τις συμβολικές μπορούν να αναφερθούν:
  • Ο φυσικότερος και πιο «ανθρώπινος» τρόπος έκφρασης των προβλημάτων. Τα προγράμματα σε γλώσσα υψηλού επιπέδου είναι πιο κοντά στα προβλήματα που επιλύουν.
  • Η ανεξαρτησία από τον τύπο του υπολογιστή. Προγράμματα σε μία γλώσσα υψηλού επιπέδου μπορούν να εκτελεστούν σε οποιονδήποτε υπολογιστή με ελάχιστες ή καθόλου μετατροπές. Η δυνατότητα της μεταφερσιμότητας των προγραμμάτων είναι σημαντικό προσόν.
  • Η ευκολία της εκμάθησης και εκπαίδευσης ως απόρροια των προηγούμενων.
  • Η διόρθωση λαθών και η συντήρηση προγραμμάτων σε γλώσσα υψηλού επιπέδου είναι πολύ ευκολότερο έργο.
Συνολικά οι γλώσσες υψηλού επιπέδου ελάττωσαν σημαντικά το χρόνο και το κόστος παραγωγής νέων προγραμμάτων, αφού λιγότεροι προγραμματιστές μπορούν σε μικρότερο χρόνο να αναπτύξουν προγράμματα που χρησιμοποιούνται σε περισσότερους υπολογιστές.
Γλώσσες 4ης γενιάς
Στις γλώσσες αυτές ο χρήστης ενός υπολογιστή έχει τη δυνατότητα σχετικά εύκολα να υποβάλει ερωτήσεις στο σύστημα ή να αναπτύσσει εφαρμογές που ανακτούν πληροφορίες από βάσεις δεδομένων και να καθορίζει τον ακριβή τρόπο εμφάνισης αυτών των πληροφοριών.

Τρίτη 8 Νοεμβρίου 2011

Sic parvis magna

έριξα μια πρόχειρη ματιά στο μάθημα 6 της C++. Με την χρήση του τελεστή cin (τουλάχιστον στον κόσμο της C++) είχα την πρώτη μου γνωριμία με την εισαγωγή δεδομένων μέσα σε μια μεταβλητή, όπως και μια γεύση για την χρησιμότητα του τύπου της μεταβλητής. αυτό είναι ένα μεγάλο πέρασμα στο κόσμο του προγραμματισμού, αφού πλέον μπορώ να περνάω δεδομένα στις μεταβλητές. Έχω να κάνω μερικά μεγαλύτερα περάσματα, αφού θα χρειαστεί να περάσω την γραμμή της αποθήκευσης σε προσωρινή μνήμη ή σε βάση δεδομένων, και φυσικά την λαχταριστή γραμμή της ανάκλησης ή της επαναπροώθησης των δεδομένων αυτών.
Ένα ολοκαίνουριος θαυμάσιος κόσμος δυναμικών περιεχομένων με περιμένει κάπου εκεί στην κοιλιά του υπολογιστή μου.


C++ μάθημα 5ο

Τελείωσα με το μάθημα 5; Ωωω... μου πήρε μόνο 3 ημέρες :P
Το ρεζουμέ λοιπόν...

Σε αυτό το μάθημα εξετάσαμε τους πιο συνηθισμένους  τελεστές αριθμητικών  πράξεων  και βηματικής  αύξησης της C++ . Πριν προχωρήσετε στο μάθημα 6, βεβαιωθείτε ότι έχετε μάθει τα παρακάτω:
  • Η C++  διαθέτει τελεστές βηματικής αύξησης σε θέση προθέματος (πριν) και επιθέματος μετά, οι οποίοι προσθέτουν 1 στην τιμή μιας μεταβλητής. H C++  διαθέτει επίσης τελεστές βηματικής μείωσης σε θέση προθέματος (πριν) και επιθέματος (μετά) οι οποίοι αφαιρούν 1 από την τιμή μιας μεταβλητής.
  • Οι τελεστές σε θέση προθέματος (πριν) ορίζουν στην C++ πρώτα να αυξήσει (η να μειώσει) την τιμή της μεταβλητής και μετά να την χρησιμοποιήσει. Οι τελεστές σε θέση επιθέματος (μετά),  ορίζουν στην C++ πρώτα την τιμή της μεταβλητής και μετά να την αυξήσει (ή να την μειώσει).
  • Για να εξασφαλίσει ότι οι παραστάσεις θα υπολογίζονται με συνεπή τρόπο, η C++ δίνει μια σειρά  προτεραιότητας σε κάθε τελεστή, ή οποία καθορίζει την σειρά με την οποία γίνονται οι πράξεις. Αν χρειάζεται να καθορίσετε την σειρά εκτέλεσης των πράξεων, τοποθετήστε  τις παραστάσεις σας μέσα σε παρενθέσεις. Η C++ υπολογίζει πρώτα  τις παραστάσεις που βρίσκονται μέσα σε παρενθέσεις.
Στο μάθημα 6 θα μάθετε πως να χρησιμοποιείτε το ρεύμα εισόδου cin για να διαβάζετε δεδομένα εισόδου από το πληκτρολόγιο και να τα αποδίδετε σε μια μεταβλητή.

Πρακτική μαθήματος:


αρχείο showmath.cpp

#include <iostream.h>
void main(void)
{
    cout << "5+7= " << 5 + 7 << endl;
    cout << "12-7= " << 12 - 7 << endl;
    cout << "1.2345*2= " << 1.2345 * 2 << endl;
    cout << "15/3= " << 15 / 3 << endl;
}

Αποτελέσματα εξόδου:
5+7= 12
12-7= 5
1.2345*2= 2.469
15/3= 5






αρχείο mathvars.cpp

#include <iostream.h>
void main(void)
{
    float kostos = 3000.00;    //κοστος εμπορέυματος
    float foros_poliseon = 0.06;    //φόρος πωλήσεων 6%
    float poso_pliromis = 4000.00;    //ποσό που πλήρωσε ο πελάτης
    float foros, resta, sinolo;    //Φόρος, ρέστα πελάτη
                    //και σύνολο λογαριαμού


    foros = kostos * foros_poliseon;
    sinolo = kostos + foros;
    resta = poso_pliromis - sinolo;

    cout << "Κόστος εμπορέυματος " << kostos << " Δρχ" <<
        "\tφόρος: " << foros << " Δρχ" <<
        "\tΣύνολο: " << sinolo << " Δρχ" << endl;

    cout << "Ρέστα για τον πελάτη: " << resta << " Δρχ" << endl;






αρχείο inccount.cpp

#include <iostream.h>
void main(void)
{
    int counter = 1000;

    cout << "Η αρχική τιμή του μετρητή είναι " << counter << endl;
    counter = counter + 1
    cout << "Η τελική τιμή του μετρητή είναι " << counter << endl;
}




αρχείο inc_op.cpp

#include <iostream.h>
void main(void)
{
    int counter = 1000;

    cout << "Η αρχική τιμή του μετρητή είναι " << counter << endl;
    counter++;
    cout << "Η τελική τιμή του μετρητή είναι " << counter << endl;
}








αρχείο pre_post.cpp

#include <iostream.h>
void main(void)
{
    int small = 0;
    int big = 1000;

    cout << "Η μεταβλητή small είναι " << small << endl;
    cout << "Η μεταβλητή small++ δίνει " << small++ << endl;
    cout << "Η μεταβλητή small καταλήγει στο " << small << endl;

    cout << "H μεταβλητή big είναι " << big << endl;
    cout << "H μεταβλητή ++big δίνει " << ++big << endl;
    cout << "Η μεταβλητή big καταλήγει στο " << big << endl;
}

αποτέλεσμα των εντολών:
Η μεταβλητή small είναι 0
Η μεταβλητή small++ δίνει 0
Η μεταβλητή small καταλήγει στο 1
Η μεταβλητή big είναι 1000
Η μεταβλητή ++big δίνει 1001
Η μεταβλητή big καταλήγει στο 1001







αρχείο deccount.cpp

#include <iostream.h>
void main(void)
{
    int small = 0;
    int big =1000;

    cout << "H μεταβλητή small είναι " << small << endl;
    cout << "Η μεταβλητή small-- δίνει " << small-- << endl;
    cout << "Η μεταβλητή small καταλήγει στο " << small << endl;

    cout << "Η μεταβλητή big είναι " << big << endl;
    cout << "Η μεταβλητή --big δίνει " << --big << endl;
    cout << "Η μεταβλητή big καταλήγει στο " << big << endl;
}


αποτέλεσμα των εντολών:
Η μεταβλητή small είναι 0
Η μεταβλητή small-- δίνει 0
Η μεταβλητή small καταλήγει στο -1
Η μεταβλητή big είναι 1000
Η μεταβλητή --big δίνει 999
Η μεταβλητή big καταλήγει στο 999

Δευτέρα 7 Νοεμβρίου 2011

Άλλοι τελεστές της C++

Τα αναδημοσιεύω από [ΕΔΩ]

 2.7 Αριθμητικοί Τελεστές

Στη C και τη C++ υπάρχουν διάφοροι τελεστές που εκτελούν συγκεκριμένες αριθμητικές πράξεις:
  • Μοναδιαίοι +,- : Δρώντας σε ένα αριθμό a μας δίνουν τον ίδιο αριθμό ή τον αντίθετό του αντίστοιχα.
  • Δυαδικοί +,-,* : Δρώντας μεταξύ δύο αριθμών a,b μας δίνουν το άθροισμα, τη διαφορά και το γινόμενό τους αντίστοιχα.
  • Δυαδικός / μεταξύ πραγματικών a,b: δίνει το λόγο a/b.
  • Δυαδικοί /,% μεταξύ ακεραίων δίνουν το πηλίκο και το υπόλοιπο της διαίρεσης αντίστοιχα.
Προσέξτε ότι δεν υπάρχει τελεστής για ύψωση σε δύναμη. Αντ' αυτού χρησιμοποιείται η συνάρτηση std::pow() που περιλαμβάνεται στον header <cmath> (Πίνακας 4.1). Ένας ιδιωματισμός της C++ είναι οι συντμήσεις των παραπάνω τελεστών με το ( = ): η πράξη a = a + b; γράφεται συνήθως ως a+=b; . Αντίστοιχα ισχύουν και για τους άλλους τελεστές ( += , -= , *= , /= , %= ) χωρίς κενά μεταξύ του τελεστή και του =. Οι δύο εκφράσεις παραπάνω είναι ισοδύναμες, εκτός από την περίπτωση που ο υπολογισμός της μεταβλητής a παρουσιάζει “παρενέργειες” σαν και αυτή που θα δούμε αμέσως παρακάτω.
Άλλος ιδιωματισμός της C++ είναι οι μοναδιαίοι τελεστές ++ και -- (χωρίς κενά) οι οποίοι δρουν είτε πριν είτε μετά την αριθμητική μεταβλητή. Αν δρουν πριν, π.χ. όπως στην έκφραση b = ++a + c; τότε αυξάνεται κατά 1 η τιμή του a, αποθηκεύεται στο a και η νέα τιμή χρησιμοποιείται για να υπολογιστεί η έκφραση. Αν δρουν μετά, π.χ. όπως στην έκφραση b = a++ + c; τότε πρώτα υπολογίζεται η έκφραση και μετά αυξάνεται κατά 1 το a και αποθηκεύεται. Αντίστοιχα (με μειώσεις κατά 1) ισχύουν για το --. Άρα το

b = --a + c;
 
ισοδυναμεί με

a = a-1;
b = a + c;
 
ενώ το

b = a-- + c;
 
ισοδυναμεί με

b = a + c;
a = a-1;
 
Παρατηρήστε ότι οι τελεστές ++ και -- μετά την αριθμητική μεταβλητή χρειάζονται μια προσωρινή ποσότητα για αποθήκευση κατά την εκτέλεση της αντίστοιχης πράξης τους και, επομένως, είναι προτιμότερο, αν δεν υπάρχει λόγος, να γίνεται η αύξηση ή μείωση με τους τελεστές πριν την αριθμητική μεταβλητή. Στον Πίνακα 2.4 παρατίθενται οι σχετικές προτεραιότητες κάποιων τελεστών. Για τελεστές ίδιας προτεραιότητας, οι πράξεις εκτελούνται από αριστερά προς τα δεξιά. Εξαίρεση αποτελούν οι τελεστές ανάθεσης και οι μοναδιαίοι. Σημειώστε ότι συνεχόμενα σύμβολα (χωρίς κενά) ομαδοποιούνται από αριστερά προς τα δεξιά από τον compiler ώστε να σχηματιστεί ο μακρύτερος σύνθετος τελεστής και δεν αντιμετωπίζονται χωριστά. Π.χ. η έκφραση a -- b θεωρείται ως (a -- )b (και είναι λάθος) παρά ως a-(-b) . Οι παρενθέσεις μπορούν να επιβάλουν διαφορετική σειρά εκτέλεσης των πράξεων.
Πίνακας: Σχετικές προτεραιότητες (κατά φθίνουσα σειρά) κάποιων τελεστών. Τελεστές στην ίδια θέση του Πίνακα έχουν ίδια προτεραιότητα.
Σχετικές Προτεραιότητες Τελεστών της C++
επιλογή μέλους κλάσης .
επιλογή μέλους δείκτη σε κλάση -->
κλήση συνάρτησης ()
εξαγωγή τιμής από πίνακα []
αύξηση/μείωση (μετά τη μεταβλητή) ++ , --
μέγεθος αντικειμένου sizeof
μέγεθος αντικειμένου ή τύπου sizeof()
αύξηση/μείωση (πριν τη μεταβλητή) ++ , --
bitwise NOT  ∼ 
εξαγωγή διεύθυνσης &
εξαγωγή τιμής από δείκτη *
λογικό NOT !
μοναδιαίο συν/πλην + , -
πολλαπλασιασμός *
διαίρεση (ή πηλίκο) /
υπόλοιπο %
άθροισμα +
διαφορά -
μετατόπιση δεξιά, αριστερά >> , <<
μικρότερο <
μικρότερο ή ίσο <=
μεγαλύτερο >
μεγαλύτερο ή ίσο >=
ίσο ==
άνισο !=
bitwise AND &
bitwise XOR ^
bitwise OR |
λογικό AND &&
λογικό OR ||
τελεστής συνθήκης2.4 ?:
απλή ανάθεση =
πολλαπλασιασμός και ανάθεση *=
διαίρεση και ανάθεση /=
υπόλοιπο και ανάθεση %=
άθροισμα και ανάθεση +=
διαφορά και ανάθεση -=
μετατόπιση αριστερά με ανάθεση <<=
μετατόπιση δεξιά με ανάθεση >>=
bitwise AND με ανάθεση &=
bitwise XOR με ανάθεση ^=
bitwise OR με ανάθεση |=
τελεστής κόμμα ,

Σε εκφράσεις που συμμετέχουν ποσότητες διαφορετικών τύπων γίνονται αυτόματα από τον compiler οι κατάλληλες μετατροπές (αν είναι εφικτές, αλλιώς στη μεταγλώττιση βγαίνει λάθος) ώστε να γίνουν όλες ίδιου τύπου και συγχρόνως να μη χάνεται η ακρίβεια. Έτσι π.χ. σε πράξη μεταξύ int και double γίνεται μετατροπή του int σε double και μετά η αντίστοιχη πράξη μεταξύ ποσοτήτων διπλής ακρίβειας. Ας σημειωθεί ότι ποσότητες τύπου μικρότερου από int (όπως bool και char ) μετατρέπονται σε int και κατόπιν εκτελείται η πράξη, ακόμα και όταν είναι ίδιες. Για να είναι κατανοητός ο κώδικας είναι καλό να αποφεύγονται “αφύσικες” εκφράσεις παρόλο που η γλώσσα προβλέπει κανόνες μετατροπής: γιατί π.χ. να χρειάζεται να προσθέσω bool και char ;
Οι μετατροπές από ένα θεμελιώδη τύπο σε άλλον, “μεγαλύτερο” (με την έννοια ότι επαρκεί για να αναπαραστήσει την αρχική τιμή) δεν κρύβουν ιδιαίτερες εκπλήξεις. Προσοχή χρειάζεται όταν γίνεται μετατροπή σε “μικρότερο” τύπο, π.χ. στην ανάθεση σε ακέραιο ενός πραγματικού αριθμού. Σε τέτοια περίπτωση γίνεται στρογγυλοποίηση του πραγματικού στον αμέσως μικρότερο ακέραιο και κατόπιν γίνεται η ανάθεση. Επιπλέον, είναι δυνατόν η στρογγυλοποιημένη τιμή να μην είναι μέσα στα όρια τιμών της προς ανάθεση μεταβλητής οπότε η συμπεριφορά του προγράμματος (και όχι μόνο το αποτέλεσμα) είναι απροσδιόριστη.2.5 Έτσι

int a = 3.14; // a is 3
short int b = 12121212121.3;  // b = ??
 
Υπάρχουν περιπτώσεις που ο προγραμματιστής θέλει να καθορίζει συγκεκριμένη μετατροπή. Όπως αναφέρθηκε, ο τελεστής ( / ) εκτελεί κάτι διαφορετικό μεταξύ πραγματικών αριθμών από ότι αν είναι μεταξύ ακεραίων. Στον παρακάτω κώδικα που υπολογίζει την (πραγματική) μέση τιμή κάποιων ακεραίων είναι απαραίτητο να επιλεχθεί η δράση του / . Αυτό επιτυγχάνεται με τη ρητή μετατροπή των ακεραίων ορισμάτων του σε πραγματικούς με την εντολή static_cast :

int sum = 2 + 3 + 5;
int N = 3;

// Wrong value
double mean1 = sum / N;   

// Correct value
double mean2 = static_cast<double>(sum) / N; 
 
Η σύνταξη του static_cast είναι:

static_cast<newtype>(variable);
 
Σε παλαιότερους κώδικες μπορείτε να δείτε τέτοιες μετατροπές με τη σύνταξη:
(newtype) variable .
Καλό είναι να μη χρησιμοποιείτε αυτή τη μορφή. Μια άλλη περίπτωση που χρειάζεται ρητή μετατροπή σε συγκεκριμένο τύπο εμφανίζεται κατά την κλήση overloaded συνάρτησης, όταν η επιλογή της κατάλληλης υλοποίησης δεν είναι μονοσήμαντη. Π.χ. η συνάρτηση της τετραγωνικής ρίζας, std::sqrt() από το <cmath> δέχεται όρισμα τύπου float , double , long double αλλά όχι int με αποτέλεσμα να χρειάζεται μετατροπή όταν ζητούμε την ρίζα ακέραιου. Όπως θα δούμε στο §4.6, η μετατροπή που κάνει ο compiler σύμφωνα με τους κανόνες της C++ δεν είναι μονοσήμαντη, οπότε πρέπει να γίνει ρητά από τον προγραμματιστή:

#include <cmath>

int
main() {
  int p = 8;

  double riza = std::sqrt(p); 
  // Error, ambiguous
  
  double r = std::sqrt(static_cast<double>(p)); 
  // Correct. Calls sqrt(double).
}
 


Ένα χαρακτηριστικό της C++ είναι ότι μια εντολή ανάθεσης ή μια εντολή σύγκρισης έχει η ίδια κάποια τιμή που μπορεί να ανατεθεί σε κάποια ποσότητα ή να μετέχει σε λογικές συνθήκες, π.χ.

int a;
int b;

b = a = 3;   
//First a = 3; then b = 3;

bool cond;

cond = b < 5; 
// First check b < 5; true. Then cond = true.
 

2.7.1 Άλλοι τελεστές



2.7.1.1 Τελεστής sizeof

Ο τελεστής sizeof δέχεται ως όρισμα μια ποσότητα ή ένα τύπο και επιστρέφει το μέγεθός τους σε bytes.2.6 Στο παρακάτω παράδειγμα δίνονται οι τρόποι κλήσης του τελεστή sizeof :

  int a;

  std::cout << sizeof(int);  
  // parentheses are necessary

  std::cout << sizeof(a);

  std::cout << sizeof a;
 
Προσέξτε ότι ο τελεστής ακολουθείται από το όνομα του τύπου ή της ποσότητας σε παρενθέσεις. Οι παρενθέσεις μπορούν να παραλείπονται αν το όρισμα είναι το όνομα ποσότητας. Η δράση του sizeof σε πίνακα (array) επιστρέφει το μέγεθος σε bytes ολόκληρου του πίνακα, δηλαδή, το πλήθος των στοιχείων επί το μέγεθος ενός στοιχείου. Έτσι, στον παρακάτω κώδικα

double a[13];

int k = sizeof(a) / sizeof(a[0]);  // k == 13
 
δρώντας κατάλληλα τον τελεστή υπολογίζεται το πλήθος των στοιχείων του πίνακα. Ο τελεστής sizeof υπολογίζεται κατά τη μεταγλώττιση και το αποτελεσμά του θεωρείται σταθερή ποσότητα· μπορεί, επομένως, να χρησιμοποιείται όπου χρειάζεται τέτοια.
Ο επιστρεφόμενος από το sizeof τύπος είναι ο std::size_t , ένας απρόσημος ακέραιος τύπος που ορίζεται στο <cstddef> . Ποσότητες τέτοιου τύπου είναι ιδιαίτερα κατάλληλες για διαστάσεις πινάκων καθώς και ως δείκτες για να προσπελαύνουμε τα στοιχεία τους.


2.7.1.2 Τελεστής κόμμα (,)

Δύο ή περισσότερες εκφράσεις μπορούν να διαχωρίζονται με τον τελεστή (,). Ο υπολογισμός τους γίνεται από αριστερά προς τα δεξιά και η τιμή της συνολικής έκφρασης είναι η τιμή της δεξιότερης.

2.7.1.3 Τελεστές bit

Υπάρχουν τελεστές που αντιμετωπίζουν τα ορίσματά τους ως σύνολο bits σε σειρά, δηλαδή ως ακολουθίες από 0 ή 1. Η δράση τους ελέγχει ή θέτει την τιμή του κάθε bit χωριστά. Τα ορίσματά τους είναι μεταβλητές με τύπο ακεραίου ( short int , int , long int , bool , char ) και enum , signed ή unsigned . Οι τελεστές παρουσιάζονται στον Πίνακα 2.5.
Πίνακας: Τελεστές bit της C++.
Τελεστής Όνομα Χρήση
 ∼  bitwise NOT  ∼  expr
<< μετατόπιση αριστερά expr1 << expr2
>> μετατόπιση δεξιά expr1 >> expr2
& bitwise AND expr1 & expr2
^ bitwise XOR expr1 ^ expr2
| bitwise OR expr1 | expr2
<<= μετατόπιση αριστερά με ανάθεση expr1 <<= expr2
>>= μετατόπιση δεξιά με ανάθεση expr1 >>= expr2
&= bitwise AND με ανάθεση expr1 &= expr2
^= bitwise XOR με ανάθεση expr1 ^= expr2
|= bitwise OR με ανάθεση expr1 |= expr2

Ο τελεστής ∼  δρώντας σε ένα ακέραιο, επιστρέφει νέο ακέραιο έχοντας μετατρέψει τα 0 του αρχικού σε 1 και αντίστροφα.
Οι τελεστές << , >> μετατοπίζουν τα bits του αριστερού τους ορίσματος κατά τόσες θέσεις όσες ορίζει το δεξί τους όρισμα. Τα επιπλέον bits χάνονται. Ο τελεστής << γεμίζει τις κενές θέσεις με 0 ενώ ο >> κάνει το ίδιο αν το αριστερό όρισμα είναι unsigned .
Οι τελεστές & , ^ , | επιστρέφουν ακέραιο με bit pattern που προκύπτει αν εκτελεστεί το AND, XOR, OR αντίστοιχα στα ζεύγη bit των ορισμάτων τους.
Η αποθήκευση bit σε ακέραιους και η χρήση τελεστών για το χειρισμό τους είναι σημαντική όταν θέλουμε να καταγράψουμε την κατάσταση (true/false, on/off, ...) ενός πλήθους αντικειμένων. Η C++ έχει εισαγάγει την κλάση bitset<> και την εξειδίκευση της κλάσης std::vector<> για bool που διευκολύνουν πολύ αυτό το σκοπό, και βέβαια είναι προτιμότερες.
Η προφανής εναλλακτική λύση ενός πίνακα με ποσότητες τύπου bool , παρόλο που είναι πιο εύχρηστη, κάνει πολύ μεγάλη σπατάλη μνήμης καθώς για την αποθήκευση ενός bit δεσμεύει τουλάχιστον ένα byte, (§2.2.4).

Ο Τελεστής Αύξησής και μείωσης στην C++

Να και ένα σημείο που πολλοί μάλλον δεν του δίνουν την απαραίτητη σημασία και μπερδεύονται: "Ο Τελεστής Αύξησής σαν πρόθεμα (πριν) και επίθεμα (Μετά)
Πρόθεμα (++counter;): Σε αυτή την περίπτωση η πρόταση απόδοσης τιμής ορίζει στην C++ να αυξήσει πρώτα την τιμή μετρητή και μετά να αποδώσει το αποτέλεσμα στην μεταβλητή.
Επίθεμα (counter++;): Με αυτή την πρόταση απόδοσης τιμής, η C++ δίνει την τρέχουσα τιμή της μεταβλητής. Επιπλέον, ο τελεστής αύξησης σε θέση επιθέματος ορίζει στην C++ να αυξήσει κατά ένα την τρέχουσα τιμή της μεταβλητής counter.
Βλέπω πάνω στο βιβλίο στο σημείο με τους τελεστές αύξησης και μείωσης σχεδιασμένο με μολύβι ένα μεγάλο ερωτηματικό από τον προηγούμενο ιδιοκτήτη του βιβλίου. Υποπτεύομαι ότι ερωτηματικό, πηγαίνει σχετικά με όλη την φάση μεταξύ προθέματος και επιθέματος, και θα συνοδευόταν κάλλιστα και με ένα εξίσου μεγάλο "γιατί". σε ακέραιες τιμές με θετικό πρόσημο, μοιάζει να μην παίζει κανέναν απολύτως λόγο η θέση του Τελεστή, και το βιβλίο δεν δίνει κανένα επαρκές παράδειγμα σχετικά με την χρησιμότητα της θέσης του τελεστή.
Να σημειωθεί ότι ο Τελεστής μείωσης (--) λειτουργεί με τον ίδιο τρόπο. Με επίθεμα (counter--;) και με πρόθεμα (--counter;) και με την ίδια ακριβώς φιλοσοφία για την θέση του Τελεστή.   
 
Στην πράξη:
αρχείο pre_post.cpp

#include <iostream.h>
void main(void)
{
    int small = 0;
    int big = 1000;

    cout << "Η μεταβλητή small είναι " << small << endl;
    cout << "Η μεταβλητή small++ δίνει " << small++ << endl;
    cout << "Η μεταβλητή small καταλήγει στο " << small << endl;

    cout << "H μεταβλητή big είναι " << big << endl;
    cout << "H μεταβλητή ++big δίνει " << ++big << endl;
    cout << "Η μεταβλητή big καταλήγει στο " << big << endl;
}

αποτέλεσμα των εντολών:
Η μεταβλητή small είναι 0
Η μεταβλητή small++ δίνει 0
Η μεταβλητή small καταλήγει στο 1
Η μεταβλητή big είναι 1000
Η μεταβλητή ++big δίνει 1001
Η μεταβλητή big καταλήγει στο 1001