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.