Εάν ξεκινάτε τον προγραμματισμό από μαθηματικό υπόβαθρο, αυτή η λεπτή λεπτομέρεια μπορεί εύκολα να σας προσελκύσει.

Η C++ είναι μια ευρέως χρησιμοποιούμενη γλώσσα προγραμματισμού, αλλά και αυτή στην οποία τα σφάλματα προγραμματισμού είναι πιο συνηθισμένα. Πολλά από αυτά τα λάθη οφείλονται σε λογικά σφάλματα. Ειδικότερα, τα σφάλματα που γίνονται κατά τη διάρκεια λειτουργιών σύγκρισης μπορεί να επηρεάσουν την ακρίβεια και την αξιοπιστία του κώδικά σας.

Η γλώσσα C++ έχει ένα συγκεκριμένο σφάλμα σύγκρισης που πολλοί νέοι προγραμματιστές παραβλέπουν. Αυτό το σφάλμα προκύπτει από μια εσφαλμένη κατανόηση του τρόπου λειτουργίας των χειριστών κατά την εκτέλεση πολλαπλών συγκρίσεων. Μάθετε πώς να αποφύγετε αυτό το κοινό λάθος και γιατί συμβαίνει εξαρχής.

Συγκρίσεις σε C++

Η γλώσσα προγραμματισμού C++ προσφέρει πολλά διαφορετικά χαρακτηριστικά και εργαλεία, μαζί με βασικές λειτουργίες, όπως τελεστές σύγκρισης. Οι τελεστές σύγκρισης είναι ειδικές λειτουργίες σε γλώσσες προγραμματισμού που μπορείτε να χρησιμοποιήσετε για να συγκρίνετε δεδομένα μεταξύ τους. Οι προγραμματιστές χρησιμοποιούν αυτούς τους τελεστές αρκετά συχνά, ειδικά όταν δημιουργούν αλγόριθμους.

Μπορείτε να δείτε τελεστές σύγκρισης σε πολλά διαφορετικά παραδείγματα στην καθημερινή ζωή. Για παράδειγμα, όταν ψωνίζετε από το παντοπωλείο, χρησιμοποιείτε αυτούς τους τελεστές στο μυαλό σας για να συγκρίνετε τις τιμές. Εάν η τιμή ενός προϊόντος είναι χαμηλότερη από το άλλο, επιλέγετε αυτό το προϊόν.

Μπορείτε να δείτε τελεστές σύγκρισης στο αν-άλλο δηλώσεις αρκετά συχνά. Οι τελεστές σύγκρισης είναι το μέρος για να ελέγξετε εάν μια τιμή είναι μεγαλύτερη από, μικρότερη ή ίση με μια άλλη τιμή. Υπάρχει μια πολύ μικρή αλλά σημαντική λεπτομέρεια που δεν πρέπει να παραβλέψετε. Τα αποτελέσματα των παραστάσεων σύγκρισης επιστρέφουν true ή false, που είναι τιμές boolean. Αυτές οι τιμές είναι ένα από τα βασικά στοιχεία της δομής ελέγχου στον προγραμματισμό.

Για παράδειγμα, στη γλώσσα προγραμματισμού C++, το "==" Ο χειριστής ελέγχει εάν δύο τιμές είναι ίσες. Εάν οι τιμές είναι ίσες, το αποτέλεσμα επιστρέφει true. Διαφορετικά, το αποτέλεσμα θα είναι ψευδές.

αν (α == ​​β)
{
ΕΠΙΣΤΡΟΦΗαληθής;
}
αλλού
{
ΕΠΙΣΤΡΟΦΗψευδής;
}

Παράδειγμα Προβλήματος Σύγκρισης

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

Για παράδειγμα, αν και η έκφραση 3 < 15 < 10 είναι μαθηματικά λανθασμένη, η C++ θεωρεί ότι το αποτέλεσμά της είναι αληθές. Μπορείτε να το αποδείξετε γράφοντας το παρακάτω απλό πρόγραμμα δοκιμής.

Αρχικά, δημιουργήστε ένα αρχείο με το όνομα test.cpp. Ανοίξτε αυτό το αρχείο χρησιμοποιώντας το δικό σας αγαπημένος επεξεργαστής κώδικα και προσθέστε τον ακόλουθο κώδικα σε αυτό.

#περιλαμβάνω
ενθ α = 15;

ενθκύριος()
{
αν (3 < α < 10)
{
std::cout << "foo" << std::endl;
}
αλλού
{
std::cout << "γιούχα" << std::endl;
}

ΕΠΙΣΤΡΟΦΗ0;
}

Μπορείτε να χρησιμοποιήσετε αυτήν την εντολή για να μεταγλωττίσετε και να εκτελέσετε τον κώδικα:

g++ test.cpp -o Δοκιμή

Τώρα έχετε ένα πρόγραμμα που ονομάζεται Δοκιμή. Εκτελέστε το πρόγραμμα και εξετάστε την έξοδο του.

Η C++ θεώρησε ότι το 3 < 15 < 10 είναι αληθές κατά την εκτέλεση αυτού του προγράμματος. Γιατί μπορεί το αποτέλεσμα να βγει έτσι, παρόλο που είναι μαθηματικά λανθασμένη πρόταση;

Αιτίες του προβλήματος σύγκρισης στη C++

Όπως οι περισσότερες γλώσσες προγραμματισμού, η C++ διαβάζει κώδικα από αριστερά προς τα δεξιά. Κάθε τελεστής σύγκρισης παράγει μια δυαδική τιμή. Οι λογικές τιμές δεν σημαίνουν απλώς αληθές και ψευδές. έχουν μαθηματικό ισοδύναμο.

Η αρχή λειτουργίας του α υπολογιστής εξαρτάται από ένα και μηδενικό. Για έναν υπολογιστή, το αποτέλεσμα κάτι είναι είτε αληθές είτε ψευδές. Τα προγράμματα υπολογιστών συνήθως αντιμετωπίζουν τον αριθμό 1 ως αληθές και τον αριθμό 0 ως ψευδή.

Εξετάστε ξανά το πρόβλημα σύγκρισης και διαβάστε τη δήλωση από αριστερά προς τα δεξιά. θα δείτε ότι υπάρχουν δύο διαφορετικές συγκρίσεις. Η πρώτη σύγκριση γίνεται μεταξύ των αριθμών 3 και 15. Αυτή είναι μια πραγματική τιμή επειδή το 3 είναι μικρότερο από το 15.

Η δεύτερη σύγκριση γίνεται μεταξύ αυτού του αποτελέσματος και του αριθμού 10. Δεδομένου ότι χρειάζεται να πραγματοποιήσει μια αριθμητική σύγκριση, η C++ μετατρέπει σιωπηλά την αληθή τιμή boole σε 1. Το 1 είναι μικρότερο από το 10, άρα το συνολικό αποτέλεσμα είναι αληθές.

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

Πώς να λύσετε προβλήματα σύγκρισης στη C++

Η C++, μαζί με τις περισσότερες άλλες γλώσσες προγραμματισμού, χρησιμοποιεί διαφορετική σύνταξη για λογική σύγκριση από τα παραδοσιακά μαθηματικά. Η μαθηματική έκφραση 3 < a < 15 σημαίνει «το 3 είναι μικρότερο του α και το a είναι μικρότερο από 15." Ωστόσο, όπως είδατε, η C++ ερμηνεύει διαφορετικά αυτήν την έκφραση.

Για να αναπαραστήσετε και στη C++, χρησιμοποιήστε τον τελεστή &&. Στη συνέχεια, μπορείτε να συνδέσετε τις δυαδικές εκφράσεις μαζί και να δημιουργήσετε λογική χρησιμοποιώντας τελεστές όπως && να αντιπροσωπεύει ΚΑΙ, || να αντιπροσωπεύει το OR, και ! να αντιπροσωπεύει ΟΧΙ. Γλώσσες όπως Η Java χρησιμοποιεί τους ίδιους λογικούς τελεστές.

Χρησιμοποιώντας τον σωστό λογικό τελεστή, μπορείτε να διορθώσετε το σφάλμα στο προηγούμενο παράδειγμα:

#περιλαμβάνω
ενθ α = 15;

ενθκύριος()
{
αν (3 < a && a < 10)
{
std::cout << "foo" << std::endl;
}
αλλού
{
std::cout << "γιούχα" << std::endl;
}

ΕΠΙΣΤΡΟΦΗ0;
}

Τώρα αυτός ο κωδικός θα ελέγξει εάν η τιμή a είναι μεγαλύτερη από 3 και εάν η τιμή a είναι μικρότερη από 10. Μεταγλωττίστε και εκτελέστε το πρόγραμμα και παρατηρήστε το αποτέλεσμα.

Το προηγούμενο παράδειγμα τύπωσε "foo", αλλά το πρόγραμμα εκτυπώνει τώρα "boo", όπως προβλεπόταν. Η boolean τιμή της αριστερής πλευράς της σύγκρισης (3 < a) είναι αληθής. Η τιμή της δεξιάς πλευράς (a < 10) είναι ψευδής. Από σωστό και λάθος είναι πάντα ψευδής, η συνολική έκφραση αξιολογείται ως ψευδής, οπότε η συνθήκη αποτυγχάνει και το αλλού μπλοκ τρεξίματα.

Δοκιμάστε να αλλάξετε το AND (&&) τελεστής σε ένα OR (||) και παρατηρώντας το διαφορετικό αποτέλεσμα.

Η σημασία των λογικών ελέγχων στη C++

Οι λογικές συγκρίσεις στη C++ περιλαμβάνουν τη χρήση δυαδικών τιμών και τελεστών σύγκρισης. Βεβαιωθείτε ότι χρησιμοποιείτε τις σωστές τιμές boolean και τους τελεστές σύγκρισης για τον έλεγχο της λειτουργίας των προγραμμάτων σας. Μπορεί να είναι δύσκολο να εντοπιστούν εκφράσεις με κακή μορφή, επειδή η C++ συχνά επιφέρει διαφορετική συμπεριφορά αντί να αποτύχει εντελώς.

Τώρα ξέρετε πώς οι μεταγλωττιστές αγνοούν αυτό το ζήτημα και αντιμετωπίζουν κάθε σύγκριση ως boolean όταν διαβάζουν από αριστερά προς τα δεξιά. Προσέξτε αυτό το πρόβλημα σε οποιαδήποτε γλώσσα χρησιμοποιείτε και μάθετε να αναγνωρίζετε τα αποτελέσματά του, ώστε να παραμείνετε ένα βήμα μπροστά.