Hvis du kommer til programmering fra en matematisk bakgrunn, kan denne subtile detaljen lett fange deg.
C++ er et mye brukt programmeringsspråk, men også et der programmeringsfeil er mest vanlig. Mange av disse feilene skyldes logiske feil. Spesielt kan feil som gjøres under sammenligningsoperasjoner påvirke nøyaktigheten og påliteligheten til koden din.
C++-språket har en spesiell sammenligningsfeil som mange nye utviklere overser. Denne feilen skyldes en feil forståelse av hvordan operatører fungerer når de utfører flere sammenligninger. Finn ut hvordan du unngår denne vanlige feilen og hvorfor den oppstår i utgangspunktet.
Sammenligninger i C++
C++-programmeringsspråket tilbyr mange forskjellige funksjoner og verktøy, sammen med grunnleggende operasjoner som sammenligningsoperatører. Sammenligningsoperatorer er spesielle operasjoner i programmeringsspråk som du kan bruke til å sammenligne data med hverandre. Utviklere bruker disse operatørene ganske ofte, spesielt når de lager algoritmer.
Du kan se sammenligningsoperatører i mange forskjellige eksempler i dagliglivet. Når du for eksempel handler i matbutikken, bruker du disse operatørene i tankene for å sammenligne priser. Hvis prisen på det ene produktet er lavere enn det andre, velger du det produktet.
Du kan se sammenligningsoperatører i if-else uttalelser ganske ofte. Sammenligningsoperatorer er stedet å gå for å sjekke om én verdi er større enn, mindre enn eller lik en annen verdi. Det er en veldig liten, men viktig detalj som du ikke bør overse. Resultater av sammenligningsuttrykk returnerer sant eller usant, som er boolske verdier. Disse verdiene er en av de grunnleggende komponentene i kontrollstrukturen i programmering.
For eksempel, i programmeringsspråket C++, "==" operatør sjekker om to verdier er like. Hvis verdiene er like, returnerer resultatet sant. Ellers vil resultatet være falskt.
hvis (a == b)
{
komme tilbakeekte;
}
ellers
{
komme tilbakefalsk;
}
Et eksempel på et sammenligningsproblem
En av de vanlige feilene C++ nybegynnere gjør er bruken av sammenligningsoperatorer. Disse operatørene lar programmerere sammenligne to verdier og utføre forskjellige operasjoner basert på resultatet av den sammenligningen. Feil bruk av disse operatørene kan imidlertid forårsake uventede feil.
For eksempel, selv om uttrykket 3 < 15 < 10 er matematisk feil, anser C++ resultatet som sant. Du kan demonstrere dette ved å skrive følgende enkle testprogram.
Først oppretter du en fil med navnet test.cpp. Åpne denne filen med din favorittkoderedigerer og legg til følgende kode til den.
#inkludere
int a = 15;inthoved-()
{
hvis (3 < a < 10)
{
std::cout << "foo" << std::endl;
}
ellers
{
std::cout << "bø" << std::endl;
}
komme tilbake0;
}
Du kan bruke denne kommandoen til å kompilere og kjøre koden:
g++ test.cpp -o Test
Du har nå et program som heter Test. Kjør programmet og undersøk resultatet.
C++ anså 3 < 15 < 10 for å være sant når du kjører dette programmet. Hvorfor kan resultatet komme ut på denne måten, selv om det er en matematisk feil påstand?
Årsaker til sammenligningsproblemet i C++
Som de fleste programmeringsspråk, leser C++ kode fra venstre til høyre. Hver sammenligningsoperator produserer en boolsk verdi. Boolske verdier betyr ikke bare sant og usant; de har en matematisk ekvivalent.
Arbeidsprinsippet til en datamaskinen er avhengig av enere og nuller. For en datamaskin er resultatet av noe enten sant eller usant. Dataprogrammer behandler vanligvis tallet 1 som sant og tallet 0 som usant.
Undersøk sammenligningsproblemet på nytt og les utsagnet fra venstre mot høyre; du vil se at det er to forskjellige sammenligninger. Den første sammenligningen er mellom tallene 3 og 15. Dette er en sann verdi fordi 3 er mindre enn 15.
Den andre sammenligningen er mellom dette resultatet og tallet 10. Siden den trenger å utføre en numerisk sammenligning, konverterer C++ den boolske sanne verdien til 1. 1 er mindre enn 10, så det totale resultatet er sant.
Avslutningsvis, selv om det virker som en matematisk feilslutning, er dette utsagnet sant for C++ og datamaskiner.
Hvordan løse sammenligningsproblemer i C++
C++, sammen med de fleste andre programmeringsspråk, bruker en annen syntaks for logisk sammenligning enn tradisjonell matematikk. Det matematiske uttrykket 3 < a < 15 betyr "3 er mindre enn a og a er mindre enn 15." Men som du har sett, tolker C++ det uttrykket annerledes.
For å representere og i C++, bruk &&-operatoren. Du kan deretter kjede boolske uttrykk sammen og bygge logikk ved å bruke operatorer som && å representere OG, || å representere OR, og ! å representere IKKE. Språk som Java bruker de samme logiske operatorene.
Ved å bruke riktig logisk operatør kan du fikse feilen i det tidligere eksemplet:
#inkludere
int a = 15;inthoved-()
{
hvis (3 < a && a < 10)
{
std::cout << "foo" << std::endl;
}
ellers
{
std::cout << "bø" << std::endl;
}
komme tilbake0;
}
Nå vil denne koden teste om verdien a er større enn 3 og om verdien a er mindre enn 10. Kompiler og kjør programmet og observer resultatet.
Det forrige eksemplet skrev ut "foo", men programmet skriver nå ut "boo", som ment. Den boolske verdien til venstre side av sammenligningen (3 < a) er sann. Verdien på høyre side (a < 10) er falsk. Siden sant og usant er alltid falsk, evalueres det overordnede uttrykket til falskt, slik at tilstanden mislykkes og ellers blokkløper.
Prøv å bytte OG (&&) operatør til en OR (||) og observere det forskjellige resultatet.
Viktigheten av logiske kontroller i C++
Logiske sammenligninger i C++ involverer bruk av boolske verdier og sammenligningsoperatorer. Pass på at du bruker de riktige boolske verdiene og sammenligningsoperatorene for å kontrollere driften av programmene dine. Det kan være vanskelig å oppdage dårlig formede uttrykk fordi C++ ofte vil utføre en annen oppførsel i stedet for å feile fullstendig.
Nå vet du hvordan kompilatorer ignorerer dette problemet og behandler hver sammenligning som en boolsk når de leser fra venstre til høyre. Se opp for dette problemet på et hvilket som helst språk du bruker, og lær deg å gjenkjenne effektene slik at du kan ligge et skritt foran.