Λογικές εκφράσεις |
Το πρόγραμμα του αρχείου COMPARES.C παρουσιάζει παραδείγματα λογικών συγκρίσεων στη C. Το πρόγραμμα ξεκινά με την δήλωση και την ταυτόχρονη αρχικοποίηση ορισμένων μεταβλητών που θα χρησιμοποιηθούν στις συγκρίσεις. |
Τελεστές σύγκρισης |
Η πρώτη ομάδα παρουσιάζει απλές συγκρίσεις των τιμών δύο μεταβλητών, τις οποίες έχουμε ήδη συνατήσει στις συνθήκες ελέγχου των δομών επανάληψης και απόφασης. Όλες οι προτάσεις έχουν τη μορφή απλού if με μιά μόνο πρόταση προς εκτέλεση, γι' αυτό δεν απαιτούνται αγκύλες μετά τη συνθήκη ελέγχου. Οποιαδήποτε από τις μεταβλητές που συμμετέχουν στις συγκρίσεις μπορεί να αντικατασταθεί είτε από μία σταθερά ή από μιά οσοδήποτε περίπλοκη έκφραση εντός παρενθέσεων, η οποία έκφραση θα παράγει ένα συμβατό αποτέλεσμα. Ο πίνακας των τελεστών αριθμητικών συγκρίσεων είναι ο παρακάτω == ίσο != διάφορο > μεγαλύτερο >= μεγαλύτερο ή ίσο < μικρότερο <= μικρότερο ή ίσο Ιδιαίτερη προσοχή στο γεγονός οτι ο τελεστής ισότητας είναι ο == ενώ της εκχώρησης είναι ο κλασσικός = ο οποίος ως γνωστό είναι το σύμβολο της ισότητας στα μαθηματικά. Αυτό οδηγεί σε εύκολα λάθη που δυστυχώς δεν γίνονται αντιληπτά από τον μεταφραστή της C γιά τον απλούστατο λόγο οτι, όπως είδαμε, η εκχώρηση είναι έκφραση η οποία μπορεί να παράγει καποιο αποτέλεσμα που μπορεί να χρησιμοποιηθεί νόμιμα σαν τμήμα λογικής σύγκρισης. Δίνονται παραδείγματα αμέσως μετά. Τελικά σημειώνεται οτι ο μοναδικός τελεστής ! συμβολίζει τη λογική άρνηση NOT έστι ώστε, γιά παράδειγμα, οι εκφράσεις !(x > z) και (x <= z) να είναι ισοδύναμες. |
Η τιμή της αλήθειας |
Η δεύτερη ομάδα παρουσιάζει συγκρίσεις κάπως πιό περίπλοκες. Η πρώτη πρόταση if δείχνει μιά εκδοχή της χρήσης της εκχώρησης σε συνθήκη ελέγχου. Η συνθήκη συγκρίνει κατ' αρχή τις πραγματικές μεταβλητές r και s.. Στη συνέχεια, το αποτέλεσμα της σύγκρισης εκχωρείται στην ακέραια μεταβλητή x. Επομένως η λογική έκφραση παράγει ένα αποτέλεσμα, που είναι μιά λογική τιμή (αληθή ή ψευδή), η οποία μάλιστα είναι ακέραια. Αυτή είναι μιά ακόμη σημαντική ιδιορρθυμία της C που προέρχεται από τις γλώσσες assembly. Μιά λογική έκφραση η οποία είναι ψευδής παράγει ως αποτέλεσμα την ακέραια τιμή μηδέν. Μιά αληθής λογική έκφραση παράγει μιά μη-μηδενική τιμή (όχι ακριβώς καθορισμένη, αλλά συνήθως ιση με τη μονάδα). Αυτό σημαίνει οτι οποιοσδήποτε ακέραιος ή χαρακτήρας μπορεί να χρησιμοποιηθεί ευθέως ως λογική μεταβλητή, όπως γιά παράδειγμα στη τελευταία πρόταση if. Αν συνεχίσουμε στη πρώτη πρόταση if διαπιστώνουμε οτι αφού η τιμή της r έχει τεθεί στο 0.0 από προηγούμενη πρόταση το αποτέλεσμα της σύγκρισης θα είναι αληθές, άρα 1 (ή γενικά μιά μη-μηδενική ακέραια ποσότητα). Αυτή η ποσότηατ θα εκχωρηθεί στη μεταβλητή x. Η εκχώρηση ως έκφραση παράγει την εκχωρούμενη τιμή ως εξαγόμενο. Έτσι η συνθήκη του if θεωρείται οτι έχει επαληθευτεί και η πρόταση εκχώρησης z = 1000 εκτελείται. Η δεύτερη πρόταση if στην ίδια ομάδα ίσως βοηθήσει στο ξεκαθάρισμα των παραπάνω. Η εκχώρηση x = y λειτουργεί έμμεσα και ως λογική έκφραση: η τιμή της μεταβλητής y όχι μόνο εκχωρείται στη μεταβλητή x αλλά ταυτόχρονα θεωρείται και ως λογική τιμή που καθορίζει την αλήθεια ή μη της πρότασης if. Δεδομένου οτι η τιμή του y είναι 11 (άρα διάφορη του μηδενός) η έκφραση θεωρείται αληθής και η πρόταση z = 222 εκτελείται. Οι δύο τελευταίες προτάσεις δείχνουν δύο ισοδύναμες συνθήκες. Η λογική έκφραση (x != 0)Tέχει τι ίδιο λογικό εξαγόμενο με την έκφραση (x) αφού αν η τιμή του x είναι μηδέν τότε το αποτέλεσμα θα είναι μηδέν (ψευδές) και στις δύο περιπτώσεις. Αλλοιώς θα είναι μιά ποσότητα διάφορη του μηδενός (αληθές) και στις δύο περιπτώσεις. |
Λογικοί τελεστές |
Η τρίτη ομάδα προτάσεων εισάγει τους λογικούς τελεστές. Ήδη έχουμε συνατήσει τον τελεστή ΝΟΤ, εδώ παρουσιάζονται οι τελεστές AND, OR. ! NOT && AND || OR Η πρώτη πρόταση if χρησιμοποιεί τον τελεστή AND. Το αποτέλεσμα της λογικής έκφρασης είναι αληθές μόνο αν όλες οι επιμέρους λογικές εκφράσεις είναι αληθείς. Δεδομένου οτι όλες οι μεταβλητές έχουν πάρει την τιμή 77 η συνθήκη ικανοποιείται και η μεταβλητή z παίρνει την τιμή 333. Η δεύτερη πρόταση if χρησιμοποιεί τον τελεστή OR. Το αποτέλεσμα της λογικής έκφρασης είναι αληθές αν τουλάχιστο μία από τις επιμέρους λογικές εκφράσεις είναι αληθής. Δεδομένου ότι η τιμή της μεταβλητής z είναι μεγαλύτερη του 12 έχουμε μιά τουλάχιστο αληθή λογική έκφραση και άρα η συνθήκη ικανοποιείται και η εκχώρηση εκτελείται. Οταν μιά λογική έκφραση υπολογίζεται από τον μεταφραστή οι υπολογισμοί αρχίζουν από τα αριστερά προς τα δεξιά, εκτός εάν ορίζεται διαφορετικά από τις παρενθέσεις. Σε κάθε περίπτωση ο υπολογισμός συνεχίζεται μέχρι να πιστοποιηθεί το αποτέλεσμα της έκφρασης. Έτσι, στην περίπτωση έκφρασης AND, μόλις βρεθεί μία ψευδής έκφραση τότε ο υπολογισμός τερματίζεται και κανένα προηγούμενο αποτέλεσμα δεν επικυρώνεται. Στη περίπτωση έκφρασης OR, αντίστοιχα, μόλις βρεθεί μία αληθής έκφραση τότε ο υπολογισμός θεωρείται επιτυχής τα προηγούμενα αποτελέσματα επικυρώνονται αλλά οι πράξεις που περιλαμβάνονται στις μη υπολογισμένες εκφράσεις μένουν ανεκτέλεστες. Αυτό το φαινόμενο λέγεται 'βραχυκύκλωμα' αφού εκφράσεις που κανονικά θα έπρεπε να υπολογιστούν δεν υπολογίζονται. Οι τρείς προτάσεις if που συμπληρώνουν την τρίτη ομάδα δείνουν παραδείγματα σχετικά με την προτεραιότητα των τελεστών. Στη τρίτη πρόταση βρίσκουμε τρείς απλές ακέραιες μεταβλητές να συνδέονται με AND. Αφού η τιμή της κάθε μεταβλητής είναι διάφορη του μηδενός η λογική έκφραση στο σύνολό της είναι αληθής. Προφανώς δεν θα μπορούσε να γίνει το ίδιο με πραγματικές μεταβλητές (θα χρειαζόταν σύγκριση με το 0.0) αλλά θα μπορούσε να γίνει με χαρακτήρες. Η επόμενη πρόταση παρουσιάζει τρείς εκχωρήσεις συνδυασμένες με AND. Αφού και οι τρείς εκχωρήσεις έχουν εξαγόμενο διάφορο του μηδενός η συνολική έκφραση είναι αληθής και οι εκχωρήσεις υλοποιούνται. Αν όμως κάποια εκχώρηση είχε εξαγόμενο μηδέν τότε όχι μόνο η έκφραση θα ήταν συνολικά ψευδής αλλά καμμιά εκχώρηση δεν θα υλοποιούνταν. Το τελευταίο παράδειγμα δείχνει ακριβώσ μιά περίπτωση όπου λόγω αναλήθειας της πρώτης λογικής έκφρασης οι υπόλοιπες δεν εξατάζονται και δεν εκτελούνται. |
Πιθανά προβλήματα |
Η τελευταία ομάδα προτάσεων if εξετάζει πιθανά προβλήματα που μπορεί να παρουσιαστούν σε λογικές εκφράσεις. Και οι τρείς προτάσεις έχουν το κοινό αποτέλεσμα οτι η μεταβλητή z δεν θα πάρει την επιθυμητή τιμή γιά διάφορους λόγους. Στην πρώτη πρόταση ο οριοθέτης πρότασης είναι σε τέτοια θέση που η εκχώρηση εκτελείται πάντα. Άρα το if δεν παίζει κανένα ρόλο. Ο μεταφραστής δεν θα εμφανίσει λάθος γιατί η κενή πρόταση θεωρείται νόμιμη πρόταση. Η επόμενη πρόταση if είναι προφανώς πάντα αληθής. Η τελευταία πρόταση εκχωρεί στη μεταβλητή x πάντα την τιμή 0 άρα είναι παντα ψευδής. |
![]() |
![]() |
![]() |