Jste zde

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

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í  , což je platná pozice, ale ta je však rovna false, pokud nebereme do úvahy typy.

Přidat komentář