Om du kommer till programmering från en matematisk bakgrund kan denna subtila detalj lätt fånga dig.
C++ är ett flitigt använt programmeringsspråk, men också ett där programmeringsfel är vanligast. Många av dessa fel beror på logiska fel. I synnerhet kan fel som görs under jämförelseoperationer påverka noggrannheten och tillförlitligheten hos din kod.
C++-språket har ett speciellt jämförelsefel som många nya utvecklare förbiser. Detta fel beror på en felaktig förståelse av hur operatörer fungerar när de utför flera jämförelser. Ta reda på hur du undviker detta vanliga misstag och varför det inträffar i första hand.
Jämförelser i C++
Programmeringsspråket C++ erbjuder många olika funktioner och verktyg, tillsammans med grundläggande funktioner som jämförelseoperatorer. Jämförelseoperatorer är specialoperationer i programmeringsspråk som du kan använda för att jämföra data med varandra. Utvecklare använder dessa operatörer ganska ofta, särskilt när de skapar algoritmer.
Du kan se jämförelseoperatörer i många olika exempel i det dagliga livet. När du till exempel handlar i mataffären använder du dessa operatörer för att jämföra priser. Om priset på en produkt är lägre än den andra väljer du den produkten.
Du kan se jämförelseoperatorer i if-else uttalanden ganska ofta. Jämförelseoperatorer är platsen att gå till för att kontrollera om ett värde är större än, mindre än eller lika med ett annat värde. Det finns en väldigt liten men viktig detalj som du inte bör förbise. Resultat av jämförelseuttryck returnerar sant eller falskt, vilket är booleska värden. Dessa värden är en av grundkomponenterna i styrstrukturen vid programmering.
Till exempel, i programmeringsspråket C++, "==" operatören kontrollerar om två värden är lika. Om värdena är lika, returnerar resultatet sant. Annars blir resultatet falskt.
om (a == b)
{
lämna tillbakaSann;
}
annan
{
lämna tillbakafalsk;
}
Ett exempel på ett jämförelseproblem
Ett av de vanligaste misstagen C++ nybörjare gör är användningen av jämförelseoperatorer. Dessa operatörer tillåter programmerare att jämföra två värden och utföra olika operationer baserat på resultatet av den jämförelsen. Om dessa operatorer används felaktigt kan det dock orsaka oväntade fel.
Till exempel, även om uttrycket 3 < 15 < 10 är matematiskt felaktigt, anser C++ dess resultat som sant. Du kan visa detta genom att skriva följande enkla testprogram.
Skapa först en fil med namnet test.cpp. Öppna den här filen med din favoritkodredigerare och lägg till följande kod till den.
#omfatta
int a = 15;inthuvud()
{
om (3 < a < 10)
{
std::cout << "foo" << std::endl;
}
annan
{
std::cout << "bua" << std::endl;
}
lämna tillbaka0;
}
Du kan använda det här kommandot för att kompilera och köra koden:
g++ test.cpp -o Test
Du har nu ett program som heter Testa. Kör programmet och granska dess resultat.
C++ ansåg 3 < 15 < 10 vara sant när det här programmet kördes. Varför kan resultatet komma ut så här, trots att det är ett matematiskt felaktigt påstående?
Orsaker till jämförelseproblemet i C++
Som de flesta programmeringsspråk läser C++ kod från vänster till höger. Varje jämförelseoperator producerar ett booleskt värde. Booleska värden betyder inte bara sant och falskt; de har en matematisk motsvarighet.
Arbetsprincipen för en datorn beror på ettor och nollor. För en dator är resultatet av något antingen sant eller falskt. Datorprogram behandlar vanligtvis siffran 1 som sann och siffran 0 som falsk.
Undersök jämförelseproblemet igen och läs påståendet från vänster till höger; du kommer att se att det finns två olika jämförelser. Den första jämförelsen är mellan siffrorna 3 och 15. Detta är ett sant värde eftersom 3 är mindre än 15.
Den andra jämförelsen är mellan det resultatet och siffran 10. Eftersom den behöver utföra en numerisk jämförelse, konverterar C++ tyst det booleska sanna värdet till 1. 1 är mindre än 10, så det totala resultatet är sant.
Sammanfattningsvis, även om det verkar som ett matematiskt felsteg, är detta påstående sant för C++ och datorer.
Hur man löser jämförelseproblem i C++
C++, tillsammans med de flesta andra programmeringsspråk, använder en annan syntax för logisk jämförelse än traditionell matematik. Det matematiska uttrycket 3 < a < 15 betyder "3 är mindre än a och a är mindre än 15." Men som du har sett tolkar C++ det uttrycket annorlunda.
För att representera och i C++, använd &&-operatorn. Du kan sedan länka samman booleska uttryck och bygga logik med hjälp av operatorer som && att representera OCH, || att representera ELLER, och ! att representera NOT. Språk som Java använder samma logiska operatorer.
Med rätt logisk operator kan du fixa felet i det tidigare exemplet:
#omfatta
int a = 15;inthuvud()
{
om (3 < a && a < 10)
{
std::cout << "foo" << std::endl;
}
annan
{
std::cout << "bua" << std::endl;
}
lämna tillbaka0;
}
Nu kommer den här koden att testa om värdet a är större än 3 och om värdet a är mindre än 10. Kompilera och kör programmet och observera resultatet.
Det föregående exemplet skrev ut "foo", men programmet skriver nu ut "boo" som avsett. Det booleska värdet på den vänstra sidan av jämförelsen (3 < a) är sant. Värdet på höger sida (a < 10) är falskt. Eftersom sant och falskt är alltid falsk, utvärderas det övergripande uttrycket till falskt, så att villkoret misslyckas och annan blocket körs.
Prova att byta AND (&&) operatör till ett OR (||) och observera de olika resultaten.
Vikten av logiska kontroller i C++
Logiska jämförelser i C++ involverar användning av booleska värden och jämförelseoperatorer. Se till att du använder rätt booleska värden och jämförelseoperatorer för att kontrollera hur dina program fungerar. Det kan vara svårt att upptäcka dåligt utformade uttryck eftersom C++ ofta kommer att utföra ett annat beteende snarare än att misslyckas helt.
Nu vet du hur kompilatorer ignorerar det här problemet och behandlar varje jämförelse som en boolean när de läser från vänster till höger. Se upp för det här problemet på alla språk du använder och lär dig känna igen dess effekter så att du kan ligga steget före.