Ak prichádzate k programovaniu z matematického prostredia, tento jemný detail vás môže ľahko zachytiť.
C++ je široko používaný programovací jazyk, ale aj jazyk, v ktorom sa najčastejšie vyskytujú programátorské chyby. Mnohé z týchto chýb sú spôsobené logickými chybami. Najmä chyby spôsobené počas porovnávacích operácií môžu ovplyvniť presnosť a spoľahlivosť vášho kódu.
Jazyk C++ má jednu konkrétnu chybu porovnávania, ktorú mnohí noví vývojári prehliadajú. Táto chyba je výsledkom nesprávneho pochopenia toho, ako operátori pracujú pri vykonávaní viacerých porovnaní. Zistite, ako sa tejto bežnej chybe vyhnúť a prečo k nej vôbec dochádza.
Porovnania v C++
Programovací jazyk C++ ponúka mnoho rôznych funkcií a nástrojov spolu so základnými operáciami, ako sú operátory porovnávania. Operátory porovnávania sú špeciálne operácie v programovacích jazykoch, ktoré môžete použiť na vzájomné porovnávanie údajov. Vývojári používajú tieto operátory pomerne často, najmä pri vytváraní algoritmov.
Porovnávacie operátory môžete vidieť v mnohých rôznych príkladoch v každodennom živote. Napríklad, keď nakupujete v obchode s potravinami, používate týchto operátorov na porovnanie cien. Ak je cena jedného produktu nižšia ako cena druhého, vyberiete si tento produkt.
Môžete vidieť porovnávacie operátory v if-others vyhlásenia celkom často. Operátory porovnávania sú miestom, kde môžete skontrolovať, či je jedna hodnota väčšia, menšia alebo rovná inej hodnote. Existuje veľmi malý, ale dôležitý detail, ktorý by ste nemali prehliadnuť. Výsledky porovnávacích výrazov vracajú true alebo false, čo sú boolovské hodnoty. Tieto hodnoty sú jedným zo základných komponentov riadiacej štruktúry pri programovaní.
Napríklad v programovacom jazyku C++ je "=="operátor skontroluje, či sú dve hodnoty rovnaké. Ak sú hodnoty rovnaké, výsledok vráti hodnotu true. V opačnom prípade bude výsledok nepravdivý.
ak (a == b)
{
vrátiťpravda;
}
inak
{
vrátiťfalošný;
}
Príklad porovnávacieho problému
Jednou z častých chýb, ktoré začiatočníci v C++ robia, je používanie porovnávacích operátorov. Tieto operátory umožňujú programátorom porovnávať dve hodnoty a vykonávať rôzne operácie na základe výsledku tohto porovnania. Nesprávne používanie týchto operátorov však môže spôsobiť neočakávané chyby.
Napríklad, hoci výraz 3 < 15 < 10 je matematicky nesprávny, C++ považuje jeho výsledok za pravdivý. Môžete to demonštrovať napísaním nasledujúceho jednoduchého testovacieho programu.
Najprv vytvorte súbor s názvom test.cpp. Otvorte tento súbor pomocou vášho obľúbený editor kódu a pridajte k nemu nasledujúci kód.
#zahŕňajú
int a = 15;intHlavná()
{
ak (3 < a < 10)
{
std::cout << "foo" << std::endl;
}
inak
{
std::cout << "boo" << std::endl;
}
vrátiť0;
}
Tento príkaz môžete použiť na kompiláciu a spustenie kódu:
g++ test.cpp -o Test
Teraz máte program s názvom Test. Spustite program a skontrolujte jeho výstup.
C++ považoval 3 < 15 < 10 za pravdivé pri spustení tohto programu. Prečo môže výsledok vyjsť takto, hoci ide o matematicky nesprávne tvrdenie?
Príčiny problému porovnania v C++
Ako väčšina programovacích jazykov, aj C++ číta kód zľava doprava. Každý operátor porovnávania vytvára boolovskú hodnotu. Booleovské hodnoty neznamenajú len true a false; majú matematický ekvivalent.
Princíp činnosti a počítač závisí od jednotiek a núl. Pre počítač je výsledok niečoho buď pravda, alebo nepravda. Počítačové programy zvyčajne považujú číslo 1 za pravdivé a číslo 0 za nepravdivé.
Znova preskúmajte problém porovnania a prečítajte si výrok zľava doprava; uvidíte, že existujú dve rôzne porovnania. Prvé porovnanie je medzi číslami 3 a 15. Toto je skutočná hodnota, pretože 3 je menej ako 15.
Druhé porovnanie je medzi týmto výsledkom a číslom 10. Keďže C++ potrebuje vykonať numerické porovnanie, potichu prevedie boolovskú skutočnú hodnotu na 1. 1 je menej ako 10, takže celkový výsledok je pravdivý.
Na záver, hoci to vyzerá ako matematický omyl, toto tvrdenie platí pre C++ a počítače.
Ako riešiť porovnávacie problémy v C++
C++ spolu s väčšinou ostatných programovacích jazykov používa na logické porovnanie inú syntax ako tradičná matematika. Matematický výraz 3 < a < 15 znamená „3 je menšie ako a a a je menej ako 15." Ako ste však videli, C++ interpretuje tento výraz inak.
Na reprezentáciu a v C++ použite operátor &&. Potom môžete spojiť booleovské výrazy a vytvoriť logiku pomocou operátorov, ako sú && reprezentovať AND, || zastupovať OR, a ! reprezentovať NIE. Jazyky ako Java používa rovnaké logické operátory.
Pomocou správneho logického operátora môžete opraviť chybu v predchádzajúcom príklade:
#zahŕňajú
int a = 15;intHlavná()
{
ak (3 < a && a < 10)
{
std::cout << "foo" << std::endl;
}
inak
{
std::cout << "boo" << std::endl;
}
vrátiť0;
}
Teraz tento kód otestuje, či je hodnota a väčšia ako 3 a či je hodnota a menšia ako 10. Zostavte a spustite program a sledujte výsledok.
Predchádzajúci príklad vytlačil „foo“, ale program teraz vypíše „boo“, ako bolo zamýšľané. Booleovská hodnota ľavej strany porovnania (3 < a) je pravdivá. Hodnota pravej strany (a < 10) je nepravdivá. Od r pravda a nepravda je vždy falošný, celkový výraz sa vyhodnotí ako nepravda, takže podmienka zlyhá a inak blokové behy.
Skúste prepnúť AND (&&) operátor na OR (||) a pozorovaním iného výsledku.
Význam logických kontrol v C++
Logické porovnania v C++ zahŕňajú použitie boolovských hodnôt a porovnávacích operátorov. Uistite sa, že používate správne boolovské hodnoty a porovnávacie operátory na riadenie prevádzky vašich programov. Môže byť ťažké rozpoznať zle vytvorené výrazy, pretože C++ sa často správa inak, než aby úplne zlyhal.
Teraz už viete, ako kompilátory ignorujú tento problém a pri čítaní zľava doprava považujú každé porovnanie za booleovské. Dávajte si pozor na tento problém v akomkoľvek jazyku, ktorý používate, a naučte sa rozpoznávať jeho účinky, aby ste boli o krok vpredu.