Dacă veniți la programare dintr-un fundal matematic, acest detaliu subtil vă poate surprinde cu ușurință.
C++ este un limbaj de programare utilizat pe scară largă, dar și unul în care erorile de programare sunt cele mai frecvente. Multe dintre aceste erori se datorează unor erori logice. În special, erorile făcute în timpul operațiunilor de comparare pot afecta acuratețea și fiabilitatea codului dvs.
Limbajul C++ are o eroare specială de comparație pe care mulți dezvoltatori noi o trec cu vederea. Această eroare rezultă dintr-o înțelegere incorectă a modului în care lucrează operatorii atunci când efectuează mai multe comparații. Aflați cum să evitați această greșeală comună și de ce apare în primul rând.
Comparații în C++
Limbajul de programare C++ oferă multe caracteristici și instrumente diferite, împreună cu operațiuni de bază, cum ar fi operatorii de comparare. Operatorii de comparare sunt operații speciale în limbaje de programare pe care le puteți utiliza pentru a compara datele între ele. Dezvoltatorii folosesc acești operatori destul de des, mai ales atunci când creează algoritmi.
Puteți vedea operatori de comparație în multe exemple diferite din viața de zi cu zi. De exemplu, atunci când faci cumpărături de la un magazin alimentar, folosești acești operatori în minte pentru a compara prețurile. Dacă prețul unui produs este mai mic decât al celuilalt, alegeți acel produs.
Puteți vedea operatorii de comparație în declarații dacă-altfel destul de des. Operatorii de comparație sunt locul unde trebuie să mergeți pentru a verifica dacă o valoare este mai mare decât, mai mică sau egală cu o altă valoare. Există un detaliu foarte mic, dar important, pe care nu trebuie să îl treceți cu vederea. Rezultatele expresiilor de comparație returnează adevărat sau fals, care sunt valori booleene. Aceste valori sunt una dintre componentele de bază ale structurii de control în programare.
De exemplu, în limbajul de programare C++, "==" operatorul verifică dacă două valori sunt egale. Dacă valorile sunt egale, rezultatul returnează adevărat. În caz contrar, rezultatul va fi fals.
dacă (a == b)
{
întoarcereAdevărat;
}
altfel
{
întoarcerefals;
}
Un exemplu de problemă de comparație
Una dintre greșelile comune pe care le fac începătorii în C++ este utilizarea operatorilor de comparație. Acești operatori permit programatorilor să compare două valori și să efectueze operații diferite pe baza rezultatului acelei comparații. Cu toate acestea, utilizarea incorect a acestor operatori poate cauza erori neașteptate.
De exemplu, deși expresia 3 < 15 < 10 este incorectă din punct de vedere matematic, C++ consideră că rezultatul său este adevărat. Puteți demonstra acest lucru scriind următorul program simplu de testare.
Mai întâi, creați un fișier numit test.cpp. Deschideți acest fișier folosind dvs editor de cod preferat și adăugați următorul cod la acesta.
#include
int a = 15;intprincipal()
{
dacă (3 < a < 10)
{
std::cout << "foo" << std::endl;
}
altfel
{
std::cout << "buu" << std::endl;
}
întoarcere0;
}
Puteți folosi această comandă pentru a compila și a rula codul:
g++ test.cpp -o Test
Acum aveți un program numit Test. Rulați programul și examinați rezultatul acestuia.
C++ a considerat 3 < 15 < 10 ca fiind adevărat atunci când rulează acest program. De ce ar putea rezultatul să iasă astfel, chiar dacă este o afirmație incorectă din punct de vedere matematic?
Cauzele problemei de comparație în C++
Ca majoritatea limbajelor de programare, C++ citește codul de la stânga la dreapta. Fiecare operator de comparație produce o valoare booleană. Valorile booleene nu înseamnă doar adevărat și fals; au un echivalent matematic.
Principiul de funcționare al a computerul depinde de unu și zero. Pentru un computer, rezultatul a ceva este fie adevărat, fie fals. Programele de calculator tratează de obicei numărul 1 ca fiind adevărat și numărul 0 ca fals.
Examinați din nou problema comparației și citiți afirmația de la stânga la dreapta; vei vedea că există două comparații diferite. Prima comparație este între numerele 3 și 15. Aceasta este o valoare adevărată, deoarece 3 este mai mic decât 15.
A doua comparație este între acel rezultat și numărul 10. Deoarece trebuie să efectueze o comparație numerică, C++ convertește în tăcere valoarea booleană adevărată la 1. 1 este mai mic de 10, deci rezultatul general este adevărat.
În concluzie, deși pare o eroare matematică, această afirmație este adevărată pentru C++ și computere.
Cum să rezolvi problemele de comparație în C++
C++, împreună cu majoritatea celorlalte limbaje de programare, utilizează o sintaxă diferită pentru comparație logică decât matematica tradițională. Expresia matematică 3 < a < 15 înseamnă „3 este mai mic decât a și a este mai mic de 15.” Cu toate acestea, după cum ați văzut, C++ interpretează această expresie diferit.
Pentru a reprezenta și în C++, utilizați operatorul &&. Puteți apoi înlănțui expresii booleene împreună și puteți construi logica folosind operatori precum && a reprezenta SI, || pentru a reprezenta SAU și ! a reprezenta NU. Limbi precum Java folosește aceiași operatori logici.
Folosind operatorul logic corect, puteți remedia eroarea din exemplul anterior:
#include
int a = 15;intprincipal()
{
dacă (3 < a && a < 10)
{
std::cout << "foo" << std::endl;
}
altfel
{
std::cout << "buu" << std::endl;
}
întoarcere0;
}
Acum acest cod va testa dacă valoarea a este mai mare decât 3 și dacă valoarea a este mai mică de 10. Compilați și rulați programul și observați rezultatul.
Exemplul anterior a tipărit „foo”, dar programul acum afișează „boo”, așa cum a fost intenționat. Valoarea booleană a părții stângi a comparației (3 < a) este adevărată. Valoarea laturii drepte (a < 10) este falsă. De cand adevarat si fals Este mereu fals, expresia generală se evaluează ca fals, astfel încât condiția eșuează și altfel blocul rulează.
Încercați să comutați AND (&&) operator la un SAU (||) și observând rezultatul diferit.
Importanța verificărilor logice în C++
Comparațiile logice în C++ implică utilizarea valorilor booleene și a operatorilor de comparație. Asigurați-vă că utilizați valorile booleene corecte și operatorii de comparație pentru a controla funcționarea programelor dvs. Poate fi dificil să reperezi expresiile prost formate, deoarece C++ va avea adesea un comportament diferit, mai degrabă decât să eșueze complet.
Acum știți cum compilatorii ignoră această problemă și tratează fiecare comparație ca un boolean atunci când citesc de la stânga la dreapta. Ai grijă la această problemă în orice limbă pe care o folosești și învață să-i recunoști efectele, astfel încât să poți rămâne cu un pas înainte.