Tak si to rozoberme:
Kód:
$riadok != 0 && $riadok % 2
Dá sa to rozdeliť na dva podvýrazy:
Kód:
($riadok != 0) && ($riadok % 2)
Prvý výraz vráti
true, ak sa hodnota v premennej
$riadok nerovná nule (resp. inej hodnote ekvivalentnej s nulou, viac
tu), inak vráti
false a vyhodnocovanie celého výrazu sa tak ukončí (ak sa výraz skladá z viacerých výrazov spojených spojkou
&& [
and, "
a zároveň"] a prvý podvýraz má hodnotu
false, tak bez ohľadu na hodnoty ostatných podvýrazov má celý výraz hodnotu
false a preto sa ďalšie výrazy nevyhodnocujú - analogicky, ak sú podvýrazy pospájané spojkou
|| [
or, "
logické alebo"] a prvý má hodnotu
true, ďalšie sa ignorujú; inak sa výrazy vyhodnocujú zľava doprava).
Náš druhý výraz je trochu zaujímavejší, je v ňom totiž skrytá troška programátorskej mágie (a ja osobne ho považujem za
veľmi prasácky, pretože nie je na prvý letmý plytký pohľad jasné, čo vlastne znamená). Zopakujme si ho ešte raz:
Kód:
$riadok % 2
. Operátor % znamená zvyšok po delení - v tomto prípade dvomi; čiže nám povie, či je číslo buď párne, alebo nepárne. To znamená, že ak je v premennej
$riadok párne číslo, hodnota výrazu bude
nula, pretože párne čísla sú deliteľné dvomi bezo zvyšku. Naopak, aj je v premennej
$riadok nepárne číslo, výraz vráti celočíselnú hodnotu
jeden. V čom spočíva tá skrytá mágia, o ktorej som hovoril na začiatku? Práve v tom, že náš výraz vracia
CELOČÍSELNÉ (integer) hodnoty a spolieha sa na magickú vlastnosť jazyka PHP podľa potreby "meniť" typ premennej. V PHP platí, že za logickú hodnotu
FALSE možno považovať aj číslo
0, aj
prázdny reťazec, aj hodnotu
NULL , aj neinicializovanú premennú. Existuje ešte špeciálny operátor porovnávania, "trojité rovná sa" === ktorý striktne kontroluje aj typ premennej. Viac v
spomenutom odkaze. Vráťme sa teraz k nášmu výrazu - čo teda v skutočnosti znamená? Ak je číslo v premennej
$riadok párne, výraz vráti logickú hodnotu
FALSE (v skutočnosti je to
celočíselná 0), ak je číslo nepárne, výraz vráti logickú hodnotu
TRUE.
OK, vráťme sa teraz k celému výrazu. Keď sa zamyslíme, zistíme, že prvý podvýraz je tam
úplne zbytočne! Prečo? Pretože vráti TRUE na každé číslo okrem nuly a FALSE len ak je to nula. Nula sa však považuje za párne číslo (zvyšok po delení nuly dvomi je nula) a preto nám v tom prípade aj druhý podvýraz vráti FALSE. Prvý podvýraz teda len zneprehľadňuje kód (druhý na tom však nie je o nič lepšie).
Nuž a ako to zapísať poriadne? Takto:
Kód:
(($riadok % 2) == 1)
Z tohto zápisu je na prvý pohľad jasné, o čo nám ide (vrátiť true na nepárne čísla).
O tom, že ide o zlý zápis sme sa mohli presvedčiť aj pri prečítaní kmsa-ovho príspevku, ktorý sa mylne domnieval, že ($riadok % 2) vráti true pre párne čísla.
_________________
A. S. Tanenbaum píše:
The terms LF, MF, and HF refer to low, medium, and high frequency, respectively. Clearly, when the names were assigned, nobody expected to go above 10 MHz, so the higher bands were later named the Very, Ultra, Super, Extremely, and Tremendously High Frequency bands. Beyond that there are no names, but Incredibly, Astonishingly, and Prodigiously high frequency (IHF, AHF, and PHF) would sound nice.