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.