Hvis du kommer til programmering fra en matematisk baggrund, kan denne subtile detalje nemt fange dig.

C++ er et meget brugt programmeringssprog, men også et, hvor programmeringsfejl er mest almindelige. Mange af disse fejl skyldes logiske fejl. Især kan fejl under sammenligningsoperationer påvirke nøjagtigheden og pålideligheden af ​​din kode.

C++-sproget har en særlig sammenligningsfejl, som mange nye udviklere overser. Denne fejl skyldes en forkert forståelse af, hvordan operatører arbejder, når de udfører flere sammenligninger. Find ud af, hvordan du undgår denne almindelige fejl, og hvorfor den opstår i første omgang.

Sammenligninger i C++

C++ programmeringssproget byder på mange forskellige funktioner og værktøjer sammen med grundlæggende operationer såsom sammenligningsoperatører. Sammenligningsoperatorer er specielle operationer i programmeringssprog, som du kan bruge til at sammenligne data med hinanden. Udviklere bruger disse operatører ret ofte, især når de opretter algoritmer.

instagram viewer

Du kan se sammenligningsoperatører i mange forskellige eksempler i dagligdagen. Når du for eksempel handler i købmanden, bruger du disse operatører i tankerne til at sammenligne priser. Hvis prisen på det ene produkt er lavere end det andet, vælger du det produkt.

Du kan se sammenligningsoperatører i if-else udsagn ret ofte. Sammenligningsoperatorer er stedet, du skal gå til for at kontrollere, om en værdi er større end, mindre end eller lig med en anden værdi. Der er en meget lille, men vigtig detalje, som du ikke bør overse. Resultater af sammenligningsudtryk returnerer sand eller falsk, som er booleske værdier. Disse værdier er en af ​​de grundlæggende komponenter i kontrolstrukturen i programmering.

For eksempel, i programmeringssproget C++, "==" operatør kontrollerer, om to værdier er ens. Hvis værdierne er ens, returnerer resultatet sandt. Ellers vil resultatet være falsk.

hvis (a == b)
{
Vend tilbagerigtigt;
}
andet
{
Vend tilbagefalsk;
}

Et eksempel på et sammenligningsproblem

En af de almindelige fejl, C++ begyndere begår, er brugen af ​​sammenligningsoperatorer. Disse operatører giver programmører mulighed for at sammenligne to værdier og udføre forskellige operationer baseret på resultatet af denne sammenligning. Brug af disse operatører forkert kan dog forårsage uventede fejl.

For eksempel, selvom udtrykket 3 < 15 < 10 er matematisk forkert, anser C++ dets resultat for at være sandt. Du kan demonstrere dette ved at skrive følgende simple testprogram.

Først skal du oprette en fil med navnet test.cpp. Åbn denne fil ved hjælp af din favorit kode editor og tilføje følgende kode til det.

#omfatte
int a = 15;

intvigtigste()
{
hvis (3 < a < 10)
{
std::cout << "foo" << std::endl;
}
andet
{
std::cout << "bøh" << std::endl;
}

Vend tilbage0;
}

Du kan bruge denne kommando til at kompilere og køre koden:

g++ test.cpp -o Test

Du har nu et program kaldet Prøve. Kør programmet og undersøg dets output.

C++ anså 3 < 15 < 10 for at være sandt, når dette program kører. Hvorfor kan resultatet komme ud på denne måde, selvom det er en matematisk forkert udsagn?

Årsager til sammenligningsproblemet i C++

Som de fleste programmeringssprog læser C++ kode fra venstre mod højre. Hver sammenligningsoperator producerer en boolesk værdi. Booleske værdier betyder ikke kun sandt og falsk; de har en matematisk ækvivalent.

Arbejdsprincippet for en computer afhænger af etaller og nuller. For en computer er resultatet af noget enten sandt eller falsk. Computerprogrammer behandler normalt tallet 1 som sandt og tallet 0 som falsk.

Undersøg sammenligningsproblemet igen og læs udsagnet fra venstre mod højre; du vil se, at der er to forskellige sammenligninger. Den første sammenligning er mellem tallene 3 og 15. Dette er en sand værdi, fordi 3 er mindre end 15.

Den anden sammenligning er mellem dette resultat og tallet 10. Da den skal udføre en numerisk sammenligning, konverterer C++ lydløst den boolske sande værdi til 1. 1 er mindre end 10, så det samlede resultat er sandt.

Afslutningsvis, selvom det virker som en matematisk fejlslutning, er denne erklæring sand for C++ og computere.

Sådan løses sammenligningsproblemer i C++

C++ bruger sammen med de fleste andre programmeringssprog en anden syntaks til logisk sammenligning end traditionel matematik. Det matematiske udtryk 3 < a < 15 betyder "3 er mindre end a og a er mindre end 15." Men som du har set, fortolker C++ det udtryk anderledes.

For at repræsentere og i C++ skal du bruge &&-operatoren. Du kan derefter kæde booleske udtryk sammen og bygge logik ved hjælp af operatorer som && at repræsentere OG, || at repræsentere OR, og ! at repræsentere IKKE. Sprog som Java bruger de samme logiske operatorer.

Ved at bruge den korrekte logiske operator kan du rette fejlen i det tidligere eksempel:

#omfatte
int a = 15;

intvigtigste()
{
hvis (3 < a && a < 10)
{
std::cout << "foo" << std::endl;
}
andet
{
std::cout << "bøh" << std::endl;
}

Vend tilbage0;
}

Nu vil denne kode teste, om værdien a er større end 3, og om værdien a er mindre end 10. Kompiler og kør programmet og observer resultatet.

Det forrige eksempel udskrev "foo", men programmet udskriver nu "boo", som tilsigtet. Den boolske værdi af venstre side af sammenligningen (3 < a) er sand. Værdien af ​​højre side (a < 10) er falsk. Siden sandt og falsk er altid falsk, evalueres det overordnede udtryk til falsk, så den betingelse mislykkes, og andet blok kører.

Prøv at skifte AND (&&) operatør til en OR (||) og observere det forskellige resultat.

Vigtigheden af ​​logiske kontroller i C++

Logiske sammenligninger i C++ involverer brugen af ​​booleske værdier og sammenligningsoperatorer. Sørg for at bruge de korrekte booleske værdier og sammenligningsoperatorer til at kontrollere driften af ​​dine programmer. Det kan være svært at få øje på dårligt formede udtryk, fordi C++ ofte vil udføre en anden adfærd i stedet for at fejle fuldstændigt.

Nu ved du, hvordan compilere ignorerer dette problem og behandler hver sammenligning som en boolsk værdi, når de læser fra venstre mod højre. Pas på dette problem på ethvert sprog, du bruger, og lær at genkende dets virkninger, så du kan være et skridt foran.