Ako u programiranje ulazite s matematičkom pozadinom, ovaj suptilni detalj može vas lako zapeti.
C++ je široko korišten programski jezik, ali i onaj u kojem su programske pogreške najčešće. Mnoge od ovih pogrešaka nastale su zbog logičkih pogrešaka. Konkretno, pogreške nastale tijekom operacija usporedbe mogu utjecati na točnost i pouzdanost vašeg koda.
Jezik C++ ima jednu posebnu pogrešku usporedbe koju mnogi novi programeri zanemaruju. Ova pogreška proizlazi iz netočnog razumijevanja načina na koji operatori rade prilikom izvođenja višestrukih usporedbi. Saznajte kako izbjeći ovu čestu pogrešku i zašto se uopće događa.
Usporedbe u C++
Programski jezik C++ nudi mnogo različitih značajki i alata, zajedno s osnovnim operacijama kao što su operatori usporedbe. Operatori usporedbe posebne su operacije u programskim jezicima koje možete koristiti za međusobnu usporedbu podataka. Programeri koriste ove operatore prilično često, osobito pri izradi algoritama.
Operatore za usporedbu možete vidjeti u mnogim različitim primjerima u svakodnevnom životu. Na primjer, kada kupujete u trgovini mješovitom robom, koristite ove operatere na umu za usporedbu cijena. Ako je cijena jednog proizvoda niža od cijene drugog, birate taj proizvod.
Operatore za usporedbu možete vidjeti u if-else izjave prilično često. Operatori usporedbe mjesto su gdje možete provjeriti je li jedna vrijednost veća, manja ili jednaka drugoj vrijednosti. Postoji vrlo mali, ali važan detalj koji ne smijete zanemariti. Rezultati usporednih izraza vraćaju true ili false, što su Booleove vrijednosti. Ove vrijednosti su jedna od osnovnih komponenti upravljačke strukture u programiranju.
Na primjer, u programskom jeziku C++, "==" operator provjerava jesu li dvije vrijednosti jednake. Ako su vrijednosti jednake, rezultat vraća true. U suprotnom, rezultat će biti lažan.
ako (a == b)
{
povratakpravi;
}
drugo
{
povrataklažno;
}
Primjer problema usporedbe
Jedna od uobičajenih pogrešaka koju čine C++ početnici je korištenje operatora za usporedbu. Ovi operatori programerima omogućuju usporedbu dviju vrijednosti i izvođenje različitih operacija na temelju rezultata te usporedbe. Međutim, neispravna uporaba ovih operatora može uzrokovati neočekivane pogreške.
Na primjer, iako je izraz 3 < 15 < 10 matematički netočan, C++ njegov rezultat smatra točnim. To možete pokazati pisanjem sljedećeg jednostavnog programa za testiranje.
Najprije stvorite datoteku pod nazivom test.cpp. Otvorite ovu datoteku koristeći svoj omiljeni uređivač koda i dodajte mu sljedeći kod.
#uključiti
int a = 15;intglavni()
{
ako (3 < a < 10)
{
std::cout << "fu" << std::endl;
}
drugo
{
std::cout << "bu" << std::endl;
}
povratak0;
}
Ovu naredbu možete koristiti za kompajliranje i pokretanje koda:
g++ test.cpp -o Test
Sada imate program pod nazivom Test. Pokrenite program i ispitajte njegov izlaz.
C++ smatra da je 3 < 15 < 10 istinito kada izvodi ovaj program. Zašto bi rezultat mogao biti ovakav, iako je to matematički netočna izjava?
Uzroci problema usporedbe u C++
Kao i većina programskih jezika, C++ čita kod s lijeva na desno. Svaki operator usporedbe daje Booleovu vrijednost. Booleove vrijednosti ne znače samo točno i netočno; imaju matematički ekvivalent.
Princip rada a računalo ovisi o jedinicama i nulama. Za računalo je rezultat nečega ili istinit ili lažan. Računalni programi obično tretiraju broj 1 kao istinit, a broj 0 kao netočan.
Ponovno ispitajte problem usporedbe i pročitajte izjavu s lijeva na desno; vidjet ćete da postoje dvije različite usporedbe. Prva usporedba je između brojeva 3 i 15. Ovo je prava vrijednost jer je 3 manje od 15.
Druga usporedba je između tog rezultata i broja 10. Budući da treba izvršiti numeričku usporedbu, C++ tiho pretvara Booleovu pravu vrijednost u 1. 1 je manji od 10, tako da je ukupni rezultat točan.
Zaključno, iako se čini kao matematička pogreška, ova izjava je istinita za C++ i računala.
Kako riješiti probleme usporedbe u C++
C++, zajedno s većinom drugih programskih jezika, koristi drugačiju sintaksu za logičku usporedbu od tradicionalne matematike. Matematički izraz 3 < a < 15 znači “3 je manje od a i a je manje od 15.” Međutim, kao što ste vidjeli, C++ drugačije tumači taj izraz.
Za predstavljanje i u C++, koristite && operator. Zatim možete ulančati Booleove izraze zajedno i izgraditi logiku koristeći operatore poput && predstavljati I, || predstavljati ILI, i ! predstavljati NE. Jezici poput Java koristi iste logičke operatore.
Upotrebom ispravnog logičkog operatora možete popraviti pogrešku u prethodnom primjeru:
#uključiti
int a = 15;intglavni()
{
ako (3 < a && a < 10)
{
std::cout << "fu" << std::endl;
}
drugo
{
std::cout << "bu" << std::endl;
}
povratak0;
}
Sada će ovaj kod testirati je li vrijednost a veća od 3 i je li vrijednost a manja od 10. Prevedite i pokrenite program te promatrajte rezultat.
Prethodni primjer ispisao je "foo", ali program sada ispisuje "boo", kao što je i predviđeno. Booleova vrijednost lijeve strane usporedbe (3 < a) je istinita. Vrijednost desne strane (a < 10) je lažna. Od istinito i lažno je uvijek lažno, ukupni izraz se procjenjuje na lažno, tako da taj uvjet ne ispunjava i drugo blok trčanja.
Pokušajte promijeniti AND (&&) operator na OR (||) i promatranje različitog rezultata.
Važnost logičkih provjera u C++
Logičke usporedbe u C++ uključuju korištenje booleovih vrijednosti i operatora usporedbe. Provjerite koristite li ispravne Booleove vrijednosti i operatore usporedbe za kontrolu rada svojih programa. Može biti teško uočiti loše oblikovane izraze jer će se C++ često drugačije ponašati umjesto da potpuno zakaže.
Sada znate kako prevoditelji ignoriraju ovaj problem i tretiraju svaku usporedbu kao booleovu kada se čita slijeva na desno. Pripazite na ovaj problem na bilo kojem jeziku koji koristite i naučite prepoznati njegove učinke kako biste mogli biti korak ispred.