Zkratka na hlavní stranu: Alt + Shift + horní 2(ě)
Linkedin FB e-mail Google Plus Twitter

Hledat na tomto webu

 
 

Osobní blog
Soukromý, neprofesní mikroblog.
Článek č. 43

 


Pořadí argumentů okolo logického operátoru and.

Pořadí argumentů okolo logického operátoru and.

Poznámka pro začínající programátory nejen v PHP.


Je výraz "a and b" totéž jako výraz "b and a"?
Ano,
ve smyslu binární logiky, podle Booleovy algebry, v souladu s matematikou, znamenají oba výrazy totéž.

Je tedy jedno, jestli v PHP napíšete
"if ($a and $b)",
nebo
"if ($b and $a)"
?
Ne,
není to jedno.

Jakto?

Vezmu to trochu oklikou, pro názornost:
Když máme výraz "A and B"
(A a zároveň B; A × B)
a zjistíme, že A == false,
tak co z toho plyne?

Plyne z toho, že výsledek bude false.
Nezávisle na tom, jaká je hodnota proměnné B.

Ještě jednou: Nezávisle na tom, jaká je hodnota proměnné B!
Čili nás už v tu chvíli hodnota proměnné B nezajímá.

A úplně stejně uvažuje i engine, který vykonává skript napsaný v jazyce PHP.

Takže pořadí podmínek má při použití operátoru "and" naprosto fatální dopad:



1) Velmi typická situace:

if ( isset($a) and ($a>0) ) {}

Tento zápis je v naprostém pořádku.
Pokud proměnná $a není nastavena,
tak PHP ví, že výsledek závorky bude každopádně false,
proto se už dál nezabývá další podmínkou, tedy netestuje, zda je hodnota $a větší než nula, a vše je v pořádku.

Není potřeba používat zápis
if ( isset($a) ) if ( $a>0 ) {},
protože v praxi oba zápisy vyjdou úplně na stejno.


Zatímco kdybyste pořadí dílčích podmínek zaměnili,
tak by vždy nejdříve bylo zjišťováno, zda má proměnná $a hodnotu větší než nula.
A to i v případě, že proměnná $a vůbec není definována, vůbec neexistuje.
PHP pak v takovém případě hodí warning,
a věřte mi, že warningy nejsou od toho, aby se ignorovaly,
warningy jsou od toho, aby se řešily,
protože warning je potenciální budoucí chyba.

A stejně jako to je u validity HTML kódu (kde mnozí ignorují chyby, protože "to stejně funguje"),
i zde platí, že když si budete kód udržovat hezký, čistý, validní, korektní, uklizený,
tak si potom hned všimnete nějakého warningu, který na vás někdy vyskočí, a který tak může zabránit hypotetické závažné chybě v programu.

A i kdybyste chtěli psát kód plný warningů (nedoporučuji),
tak pořád platí, že isset napsaný až po operátoru and, když už se předtím testovala konkrétní hodnota, je úplně k ničemu.
Nemusíte už ověřovat, jestli nějaká proměnná vůbec existuje, když už jste stejně na férovku zjišťovali její hodnotu.


Takže na pořadí dílčích podmínek okolo operátoru and záleží.



2) Inkrementace (přičtení jedničky). I jiné akce:

PHP vám umožňuje přímo v podmínce měnit hodnotu proměnné.

(Takže bacha, abyste při porovnávání používali dvě rovnítka;
jak jedno vynecháte, tak hodnotu druhé proměnné přiřadíte té první,
a budete se strašně divit, co ten skript dělá.)

Nejde ale jen o rovnítko.

Přímo v porovnání můžete použít i zápis $a++,
případně také ++$a (což je fatální rozdíl právě při porovnávání proměnných).

Takže není jedno, zda tato podmínka bude posuzována, nebo nebude.
Když ji budete mít až za and,
a dílčí podmínka umístěná před and vrátí dílčí hodnotu false,
tak ta druhá podmínka nebude vůbec posuzována, čili to, co je v ní ukryto, se nevykoná,
a vy byste se mohli hodně divit.


Totéž platí i pro dekrementaci (odečtení jedničky)
"$a--", resp. "--$a".


A platí to i pro SQL dotazy
a pro spouštěné funkce (!)
a pro cokoliv dalšího,
co vám vrátí nějakou hodnotu (takže to třeba použijete v podmínce),
jenže cestou to něco dělá, něco mění (takže fakt není jedno, jestli to proběhne, nebo ne).




3) Optimalizace výkonu.

Pokud mám dvě dílčí hodnoty, jejichž pořadí není ovlivněno ani bodem 1 ani bodem 2 ad výše,
tak mne může zajímat pravděpodobnost, že v reálném provozu bude některá z těch dílčích podmínek obvykle vracet nějakou předvídatelnou hodnotu.


Např. pokud budu mít podmínku v cyklu "while" (nebo "do while"),

kde jedna z těch podmínek bude řídicí, provozní;
a druhá dílčí podmínka bude nouzová, záchranná, pro případ netypické situace, abychom se nezacyklili a korektně cyklus ukončili bez zbytečného zvyšování teploty v serverovně a stresování uživatelů,

tak naprosto dává smysl testovat nejdříve tu provozní, pak teprve použít "and", a pak teprve napsat tu jisticí podmínku.

Protože ta jisticí podmínka bude mít typicky hodnotu true (když se bavíme o modelu while( něco and něco) { něco dělej} ),
a tak je nevhodné ji uvádět jako první, když se po ní téměř vždy bude provádět i ta druhá.
Je lepší uvést jako první tu, která nám častěji hodí false, a tak způsobí, že se druhá dílčí podmínka už nebude testovat.
Pokud jedna z podminek je vetsinou false, tak ji dam jako prvni, a diky tomu ta druha obvykle neni zbytecne testovana.


Samozřejmě kromě situací ad bod 1 (isset) nebo ad bod 2 (výkon akce v podmínce), to je jasné.






Takže na pořadí okolo "and" v PHP záleží.


Jo, a toto všechno samozřejmě platí i pro operátor "or".
Jen naopak. Tam se další dílčí podmínka netestuje, pokud má ta předchozí hodnotu true.

Takže kdyby šlo třeba o optimalizaci výkonu, tak okolo logického operátoru "or" narovnám dílčí podmínky tak,
aby první byla ta, která má častěji hodnotu true, protože tím zařídí, že se počítač nebude muset zabývat tou druhou dílčí podmínkou.






Shrnutí a SEO keywords:
Podminka if
operator and or
na poradi zalezi
operator a zaroven
operator nebo
PHP

V praxi zalezi na poradi dilcich podminek,
i kdyz teoreticky matematicky na nem zalezet nema.


Ono to vlastně tématicky trošku souvisí s Karnaughovou mapou:
Tam také vidíme, že na základě nějaké hodnoty nějaké vstupní proměnné si můžeme dovolit nezkoumat hodnotu některé jiné proměnné, protože jistě víme, že už nás v tu chvíli vlastně nezajímá. Tak to samé ví i PHP engine.

Můžete si to snadno vyzkoušet:

<?php

$i=0;

if (0 and $i++>0) echo '';

echo $i.'<br />';

if ($i++>0 and 0) echo '';

echo $i.'<br />';

?>

 

Související odkazy

  


Líbil se Vám článek?


Zpětná vazba – hlasování

Hlasy se na serveru připočítají k počitadlům pro tento článek, např. kolikrát tento článek někoho pobavil a kolikrát tento článek někomu pomohl.

Neukládají se jednotlivá hlasování (vzájemná kombinace hlasů, datum, čas, ani jiné údaje).
Proto nemá smysl odesílat prázdný hlas, nemělo by se co k čemu přičíst.

 

Ve Vašem prohlížeči nebude uložena žádná informace (cookies) o tom, že už jste hlasovali.
- Ve Vašem prohlížeči tedy nebude vidět, jak jste hlasovali.
- Kdykoliv budete moci hlasovat znovu, pokud Vám článek opakovaně pomůže (pobaví Vás, potěší, …).
- Pokud Vás právě u jednoho počítače sedí více, mohou postupně hlasovat další lidé.

Počítám člověkohlasy, nikoliv lidi.
Tedy kolikrát článek někomu pomohl,
nikoliv kolika lidem pomohl
.

Třikrát potěšeného jednoho čtenáře počítám stejně jako tři různé jednou potěšené čtenáře.

Každý má do budoucna neomezený počet hlasů.
Když zapomenete, že jste pro tento článek už hlasovali, nevadí – když Vám někdy v budoucnu bude např. užitečný znovu, tak mu znovu pošlete hlas, že Vám byl užitečný.

Můžete si zvolit 1 až N možností

Štítky, labels, kategorie, témata, tagy, hashtagy

(ve vývoji)
 
#science-technology   #electro-ict    
#languages  
 

Skok nahoru na: Navigační menu
(klávesová zkratka Alt + Shift + horní „5”)

Zaujala Vás tato stránka?

  • Přidat do záložek (Ctrl+D)
  • Sdílet odkaz (vysílačka)Skok nahoru na:
  • Vytisknout (Ctrl+P)
  • Citovat podle ČSN ISO 690

    Tuto stránku

    ADÁMEK, Martin. Osobní blog: Soukromý, neprofesní mikroblog. . Martin Adámek [online]. Náchod / Meziměstí [cit. 2024-07-27]. Dostupné z: https://www.adamek.cz/blog

    Celý web

    ADÁMEK, Martin. Martin Adámek [online]. Náchod / Meziměstí [cit. 2024-07-27]. Dostupné z: https://www.adamek.cz

 

 
 

Národní kulturní dědictví

WebArchiv – Stránky archivovány Národní knihovnou ČR Tyto stránky jsou pravidelně archivovány Národní knihovnou ČR pro svou kulturní, vzdělávací, vědeckou, výzkumnou nebo jinou informační hodnotu za účelem dokumentace autentického vzorku českého webu. Jsou součástí kolekce českých webových stránek, které NK ČR hodlá dlouhodobě uchovávat a zpřístupňovat pro budoucí generace. Jejich záznam je součástí České národní bibliografie a katalogu NK ČR.  

 

 
 

Pro rozptýlení

Jede Pepíček s babičkou vlakem a povídá:
„Babi, koukni se na tu množinu kraviček, co se pase na louce!”
„Ať koukám, jak koukám, žádné kravičky nevidím?”
„Však to taky je prázdná množina, babičko…”

 

Pro zamyšlení

Válka je hrozná, nepřípustná, ale ještě hroznější a nepřípustnější je otroctví.
[Karel Čapek]