Ještě jednou a lépe: explicitní porovnání s true/false

Od Petr Zemek, 2013-12-14

Dnes se mrkneme na podmínky, ve kterých se explicitně provádí porovnání s pravdivostní hodnotou a ukážeme si, jak je udělat čitelnější.

Původní kód

Občas v C a C++ vídávám kód podobný tomuto:

if (cond == true)  // (1)
if (cond != true)  // (2)
if (cond == false) // (3)
if (cond != false) // (4)

Proč takto raději ne?

Je to méně čitelné a nutí to čtenáře provádět zbytečné myšlenkové pochody, jen aby pochopil, zda se tělo podmíněného příkazu vykoná či nikoliv. Vezměme si např. situaci (3). Čtenář nejdříve v hlavě vyhodnotí podmínku cond a ptá se, zda je výsledek rovný false. Čili pokud byla cond pravdivá, tak se porovná true a false, což dá false. Tělo se tedy nevykoná. Pokud byla cond nepravdivá, tak porovná se false a false a tělo podmíněného příkazu se tedy vykoná. Uff. Mně osobně podobné podmínky dají vždy zabrat a připadám si potom jako mentálně znásilněný :).

Jak to udělat lépe?

if (cond)  // (1)
if (!cond) // (2)
if (!cond) // (3)
if (cond)  // (4)

Poznámka k jiným jazykům

V některých jazycích, jako je PHP či JavaScript, může být někdy nutné provést explicitní porovnání s pravdivostní hodnotou. Jako příklad uvedu funkci strpos z PHP, která při úspěchu vrací pozici řetězce v jiném řetězci a při neúspěchu vrací false. Zde by kontrola výsledku volání této funkce měla vypadat takto:

$pos = strpos("abc", "a");
if ($pos !== false) {
    echo "Yes";
} else {
    echo "No";
}

Všimněte si použití operátoru !==, který kontroluje i nerovnost typů, nejen hodnot. Pokud bychom totiž napsali jen

$pos = strpos("abc", "a");
if ($pos != false) {
    echo "Yes";
} else {
    echo "No";
}

či

if (strpos("abc", "a")) {
    echo "Yes";
} else {
    echo "No";
}

tak by tento kód vypsal "No" na místo očekávaného "Yes". Důvodem je, že funkce vrátí 0, což je platná pozice, ale ta je však rovna false, pokud nebereme do úvahy typy.

Obsah tohoto pole je soukromý a nebude veřejně zobrazen.

Filtrované HTML (využíváno)

  • Povolené HTML značky: <a href hreflang> <em> <strong> <cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <table>
  • Zvýraznění syntaxe kódu lze povolit přes následující značky: <code>, <blockcode>, <bash>, <c>, <cpp>, <haskell>, <html>, <java>, <javascript>, <latex>, <perl>, <php>, <python>, <ruby>, <rust>, <sql>, <text>, <vim>, <xml>, <yaml>.
  • Řádky a odstavce se zalomí automaticky.
  • Webové a e-mailové adresy jsou automaticky převedeny na odkazy.
CAPTCHA
1 + 3 =
Vyřešte tento jednoduchý matematický příklad a vložte výsledek. Např. pro 1+3 vložte 4.
Nějak se mi tady rozmohl spam, takže poprosím o ověření.