Če prihajate k programiranju iz matematičnega ozadja, vas lahko ta subtilna podrobnost zlahka ujame.
C++ je široko uporabljan programski jezik, vendar tudi tisti, v katerem so programske napake najpogostejše. Mnoge od teh napak so posledica logičnih napak. Zlasti napake med primerjalnimi operacijami lahko vplivajo na točnost in zanesljivost vaše kode.
Jezik C++ ima eno posebno primerjalno napako, ki jo mnogi novi razvijalci spregledajo. Ta napaka je posledica nepravilnega razumevanja delovanja operaterjev pri izvajanju več primerjav. Ugotovite, kako se izogniti tej pogosti napaki in zakaj do nje sploh pride.
Primerjave v C++
Programski jezik C++ ponuja veliko različnih funkcij in orodij, skupaj z osnovnimi operacijami, kot so primerjalni operaterji. Operatorji primerjave so posebne operacije v programskih jezikih, ki jih lahko uporabite za medsebojno primerjavo podatkov. Razvijalci te operaterje uporabljajo precej pogosto, zlasti pri ustvarjanju algoritmov.
Primerjalne operatorje lahko vidite v številnih različnih primerih v vsakdanjem življenju. Na primer, ko nakupujete v trgovini z živili, uporabite te operaterje v mislih za primerjavo cen. Če je cena enega izdelka nižja od cene drugega, izberete ta izdelek.
Primerjalne operatorje si lahko ogledate v izjave if-else kar pogosto. Operatorji primerjave so kraj, kamor lahko preverite, ali je ena vrednost večja, manjša ali enaka drugi vrednosti. Obstaja zelo majhna, a pomembna podrobnost, ki je ne smete spregledati. Rezultati primerjalnih izrazov vrnejo true ali false, ki so logične vrednosti. Te vrednosti so ena izmed osnovnih komponent krmilne strukture v programiranju.
Na primer, v programskem jeziku C++ je "==" preveri, ali sta dve vrednosti enaki. Če sta vrednosti enaki, vrne rezultat true. V nasprotnem primeru bo rezultat napačen.
če (a == b)
{
vrnitevprav;
}
drugače
{
vrnitevlažno;
}
Primer težave s primerjavo
Ena od pogostih napak začetnikov C++ je uporaba primerjalnih operatorjev. Ti operaterji programerjem omogočajo primerjavo dveh vrednosti in izvajanje različnih operacij na podlagi rezultata te primerjave. Vendar pa lahko nepravilna uporaba teh operaterjev povzroči nepričakovane napake.
Na primer, čeprav je izraz 3 < 15 < 10 matematično napačen, C++ meni, da je njegov rezultat resničen. To lahko pokažete tako, da napišete naslednji preprost testni program.
Najprej ustvarite datoteko z imenom test.cpp. Odprite to datoteko s svojim najljubši urejevalnik kode in ji dodajte naslednjo kodo.
#vključujejo
int a = 15;intglavni()
{
če (3 < a < 10)
{
std::cout << "foo" << std::konec;
}
drugače
{
std::cout << "boo" << std::konec;
}
vrnitev0;
}
Za prevajanje in zagon kode lahko uporabite ta ukaz:
g++ test.cpp -o Test
Zdaj imate program, imenovan Test. Zaženite program in preglejte njegov rezultat.
C++ je pri izvajanju tega programa upošteval 3 < 15 < 10 kot resnično. Zakaj je lahko rezultat takšen, čeprav je matematično napačna trditev?
Vzroki za težave s primerjavo v C++
Kot večina programskih jezikov tudi C++ bere kodo od leve proti desni. Vsak primerjalni operator ustvari logično vrednost. Logične vrednosti ne pomenijo le res in false; imajo matematični ekvivalent.
Načelo delovanja a računalnik je odvisen od enic in ničel. Za računalnik je rezultat nečesa resničen ali napačen. Računalniški programi običajno obravnavajo število 1 kot resnično in število 0 kot napačno.
Še enkrat preglejte problem primerjave in preberite trditev od leve proti desni; videli boste, da gre za dve različni primerjavi. Prva primerjava je med številkama 3 in 15. To je prava vrednost, ker je 3 manj kot 15.
Druga primerjava je med tem rezultatom in številko 10. Ker mora izvesti numerično primerjavo, C++ tiho pretvori logično pravo vrednost v 1. 1 je manj kot 10, torej je skupni rezultat resničen.
Skratka, čeprav se zdi kot matematična zmota, ta izjava velja za C++ in računalnike.
Kako rešiti težave s primerjavo v C++
C++, skupaj z večino drugih programskih jezikov, uporablja drugačno sintakso za logično primerjavo kot tradicionalna matematika. Matematični izraz 3 < a < 15 pomeni, da je »3 manj kot a in a je manj kot 15." Vendar, kot ste videli, C++ ta izraz razlaga drugače.
Za predstavitev in v C++ uporabite operator &&. Nato lahko povežete logične izraze in zgradite logiko z uporabo operatorjev, kot je && predstavljati IN, || predstavljati ALI in ! predstavljati NE. Jeziki kot Java uporablja enake logične operaterje.
Z uporabo pravilnega logičnega operatorja lahko popravite napako v prejšnjem primeru:
#vključujejo
int a = 15;intglavni()
{
če (3 < a && a < 10)
{
std::cout << "foo" << std::konec;
}
drugače
{
std::cout << "boo" << std::konec;
}
vrnitev0;
}
Zdaj bo ta koda preizkusila, ali je vrednost a večja od 3 in ali je vrednost a manjša od 10. Prevedite in zaženite program ter opazujte rezultat.
Prejšnji primer je natisnil »foo«, program pa zdaj natisne »boo«, kot je predvideno. Logična vrednost leve strani primerjave (3 < a) je resnična. Vrednost desne strani (a < 10) je napačna. Od resnično in napačno je vedno lažno, se celotni izraz oceni kot false, tako da ta pogoj ne uspe in je drugače blok teče.
Poskusite preklopiti IN (&&) v ALI (||) in opazovanje drugačnega rezultata.
Pomen logičnih preverjanj v C++
Logične primerjave v C++ vključujejo uporabo logičnih vrednosti in primerjalnih operatorjev. Prepričajte se, da uporabljate pravilne logične vrednosti in primerjalne operatorje za nadzor delovanja svojih programov. Težko je opaziti slabo oblikovane izraze, ker bo C++ pogosto izvajal drugačno vedenje, namesto da bi popolnoma odpovedal.
Zdaj veste, kako prevajalniki ignorirajo to težavo in vsako primerjavo pri branju od leve proti desni obravnavajo kot logično. Pazite na to težavo v katerem koli jeziku, ki ga uporabljate, in se naučite prepoznati njene učinke, da boste lahko korak pred njimi.