Zkrácené vyhodnocení
#include <stdio.h>
int tiskni_nepravda() {
printf("Jsem ve funkci\n");
return 0;
}
int main()
{
if (tiskni_nepravda() && tiskni_nepravda() && tiskni_nepravda()) {
// nic
}
return 0;
}
Tento program nám dává
Jsem ve funkci
Jak je možné, že se nevytiskne Jsem ve funkci
třikrát? Podívejme se na další příklad
#include <stdio.h>
int tiskni_nepravda() {
printf("Jsem ve funkci nepravda\n");
return 0;
}
int tiskni_pravda() {
printf("Jsem ve funkci pravda\n");
return 1;
}
int main()
{
if (tiskni_pravda() && tiskni_nepravda() && tiskni_nepravda()) {
// nic
}
return 0;
}
Jsem ve funkci pravda
Jsem ve funkci nepravda
Opět se nám nevytisklo druhé Jsem ve funkci nepravda
.
Je to proto, že se vyhodnocuje následovně:
Nejdříve začneme s
if (tiskni_pravda() && tiskni_nepravda() && tiskni_nepravda())
Pak se vyhodnotí první tiskni_pravda
. Dostáváme
if (1 && tiskni_nepravda() && tiskni_nepravda())
Dává smysl vyhodnocovat podmínku dále? Ano, dává. Pokud máme operátor &&
a jedna strana je pravdivá, tak ji můžeme vynechat a pokračovat dál. Dostáváme
if (tiskni_nepravda() && tiskni_nepravda())
Pokračuje se ve vyhodnocování, takže se vyhodnotí první tiskni_nepravda
a dostáváme
if (0 && tiskni_nepravda())
Pokud je jedna část &&
operátoru nepravdivá, tak je celý výraz nepravdivý a tedy není důvod výraz dále vyhodnocovat. Výsledek je tedy
if (0)
Obecně se tomu říká zkrácené vyhodnocování. Funguje to i s OR operátorem.
#include <stdio.h>
int tiskni_pravda() {
printf("Jsem ve funkci pravda\n");
return 1;
}
int main()
{
if (tiskni_pravda() || tiskni_pravda()) {
// nic
}
return 0;
}
Dostáváme
Jsem ve funkci pravda
Opět došlo ke zkrácenému vyhodnocení. První funkce se vyhodnotí jako pravda a zbytek se zahodí, protože stačí, když je pravdivá jedna strana operátoru ||
. Dostáváme postupně
if (1 || tiskni_pravda())
A následně je celý výraz pravdivý, není důvod vyhodnocovat dál
if (1)
Odkazy
Následující kapitola: Bitové operace