Pokud přicházíte k programování z matematického prostředí, tento jemný detail vás snadno zaujme.
C++ je široce používaný programovací jazyk, ale také jazyk, ve kterém se nejčastěji vyskytují programovací chyby. Mnoho z těchto chyb je způsobeno logickými chybami. Zejména chyby vzniklé během porovnávacích operací mohou ovlivnit přesnost a spolehlivost vašeho kódu.
Jazyk C++ má jednu konkrétní chybu srovnání, kterou mnoho nových vývojářů přehlíží. Tato chyba vyplývá z nesprávného pochopení toho, jak operátoři pracují při provádění více porovnání. Zjistěte, jak se této běžné chybě vyhnout a proč k ní vůbec dochází.
Srovnání v C++
Programovací jazyk C++ nabízí mnoho různých funkcí a nástrojů spolu se základními operacemi, jako jsou porovnávací operátory. Porovnávací operátory jsou speciální operace v programovacích jazycích, které můžete použít k vzájemnému porovnání dat. Vývojáři používají tyto operátory poměrně často, zejména při vytváření algoritmů.
Srovnávací operátory můžete vidět na mnoha různých příkladech v každodenním životě. Když například nakupujete v obchodě s potravinami, používáte tyto operátory k porovnání cen. Pokud je cena jednoho produktu nižší než cena druhého, vyberete si tento produkt.
Můžete vidět porovnávací operátory v if-others prohlášení docela často. Porovnávací operátory jsou místem, kde můžete zkontrolovat, zda je jedna hodnota větší, menší nebo rovna jiné hodnotě. Existuje velmi malý, ale důležitý detail, který byste neměli přehlédnout. Výsledky porovnávacích výrazů vrací true nebo false, což jsou booleovské hodnoty. Tyto hodnoty jsou jednou ze základních součástí řídicí struktury v programování.
Například v programovacím jazyce C++ je "=="operátor zkontroluje, zda jsou dvě hodnoty stejné. Pokud jsou hodnoty stejné, výsledek vrátí hodnotu true. V opačném případě bude výsledek falešný.
-li (a == b)
{
vrátit seskutečný;
}
jiný
{
vrátit seNepravdivé;
}
Příklad srovnávacího problému
Jednou z častých chyb začátečníků v C++ je používání porovnávacích operátorů. Tyto operátory umožňují programátorům porovnávat dvě hodnoty a provádět různé operace na základě výsledku tohoto srovnání. Nesprávné použití těchto operátorů však může způsobit neočekávané chyby.
Například, ačkoli výraz 3 < 15 < 10 je matematicky nesprávný, C++ považuje jeho výsledek za pravdivý. Můžete to demonstrovat napsáním následujícího jednoduchého testovacího programu.
Nejprve vytvořte soubor s názvem test.cpp. Otevřete tento soubor pomocí vašeho oblíbený editor kódu a přidejte do něj následující kód.
#zahrnout
int a = 15;inthlavní()
{
-li (3 < a < 10)
{
std::cout << "foo" << std::endl;
}
jiný
{
std::cout << "vypískat" << std::endl;
}
vrátit se0;
}
Tento příkaz můžete použít ke kompilaci a spuštění kódu:
g++ test.cpp -o Test
Nyní máte program s názvem Test. Spusťte program a prozkoumejte jeho výstup.
C++ při spuštění tohoto programu považoval 3 < 15 < 10 za pravdivé. Proč může výsledek vyjít takto, i když je to matematicky nesprávné tvrzení?
Příčiny problému srovnávání v C++
Jako většina programovacích jazyků i C++ čte kód zleva doprava. Každý operátor porovnání vytváří booleovskou hodnotu. Booleovské hodnoty neznamenají jen true a false; mají matematický ekvivalent.
Princip práce a počítač závisí na jedničkách a nulách. Pro počítač je výsledek něčeho buď pravdivý, nebo nepravdivý. Počítačové programy obvykle považují číslo 1 za pravdivé a číslo 0 za nepravdivé.
Znovu prozkoumejte problém srovnávání a přečtěte si výrok zleva doprava; uvidíte, že existují dvě různá srovnání. První srovnání je mezi čísly 3 a 15. Toto je skutečná hodnota, protože 3 je menší než 15.
Druhé srovnání je mezi tímto výsledkem a číslem 10. Protože potřebuje provést numerické srovnání, C++ tiše převede booleovskou skutečnou hodnotu na 1. 1 je menší než 10, takže celkový výsledek je pravdivý.
Na závěr, ačkoli se to zdá jako matematický omyl, toto tvrzení platí pro C++ a počítače.
Jak řešit srovnávací problémy v C++
C++ spolu s většinou ostatních programovacích jazyků používá pro logické srovnání jinou syntaxi než tradiční matematika. Matematický výraz 3 < a < 15 znamená „3 je menší než a a a je menší než 15." Jak jste však viděli, C++ interpretuje tento výraz odlišně.
Pro reprezentaci a v C++ použijte operátor &&. Poté můžete zřetězit booleovské výrazy dohromady a vytvořit logiku pomocí operátorů jako && reprezentovat AND, || reprezentovat OR, a ! reprezentovat NE. Jazyky jako Java používá stejné logické operátory.
Pomocí správného logického operátoru můžete opravit chybu v předchozím příkladu:
#zahrnout
int a = 15;inthlavní()
{
-li (3 < a && a < 10)
{
std::cout << "foo" << std::endl;
}
jiný
{
std::cout << "vypískat" << std::endl;
}
vrátit se0;
}
Nyní tento kód otestuje, zda je hodnota a větší než 3 a zda je hodnota a menší než 10. Zkompilujte a spusťte program a sledujte výsledek.
Předchozí příklad vytiskl „foo“, ale program nyní vytiskne „boo“, jak bylo zamýšleno. Booleovská hodnota levé strany srovnání (3 < a) je pravdivá. Hodnota pravé strany (a < 10) je nepravdivá. Od té doby pravdivé a nepravdivé je vždy Nepravdivé, celkový výraz se vyhodnotí jako nepravda, takže podmínka selže a jiný blokové běhy.
Zkuste přepnout AND (&&) operátor na OR (||) a pozorování jiného výsledku.
Význam logických kontrol v C++
Logická srovnání v C++ zahrnují použití booleovských hodnot a operátorů porovnání. Ujistěte se, že používáte správné booleovské hodnoty a operátory porovnání k řízení provozu vašich programů. Může být obtížné odhalit špatně vytvořené výrazy, protože C++ se často chová jinak, než aby úplně selhal.
Nyní víte, jak kompilátory tento problém ignorují a při čtení zleva doprava považují každé srovnání za booleovské. Dejte si pozor na tento problém v jakémkoli jazyce, který používáte, a naučte se rozpoznávat jeho účinky, abyste byli o krok napřed.