Dnešní pondělní hádanka se týká bitových operací. Následující skript zjišťuje
pomocí logického součinu přítomnost druhého nejnižšího bitu
v proměnné $foo
. Jenže vrací opačné výsledky, než by se
očekávalo. Kde je chyba?
// pro 1
$foo = 1;
// čekám false, ale vrací true!
$isSet = ($foo & 2 == 2);
// pro 2
$foo = 2;
// čekám true, ale vrací false!
$isSet = ($foo & 2 == 2);
Komentáře
Mormegil #1
Tipnul bych prioritu operátorů. Každopádně podobné věci závorkuju i v jazycích, o kterých toho vím o dost víc než o PHP. 🙂
pavel #2
Veskere bitove operatory maji vyssi prioritu takze:
$isSet = ($foo & 2 == 2) = 1 & (2==2) = 1 & (true) = true & true = true
pripadne se dvojkou
Takze chyba tam zadna neni jenom autor chybne ocekaval jine vysledky… opet problem u klavesnice ;)
pavel #3
Kua ne bitove ale porovnavaci ;)
Adam Hošek #4
#1 Mormegile, No jistě. Nejdřív jsem na to koukal. Pak jsem si vzal papír a propisku. Pak mi došlo, že to má vracet očekávané hodnoty, ale protože nevrací, tak to může být jedině priorita. Tak jsem kouknul do manuálu a bingo! & je hned pod == :)). Pak už je to logicky – ^ má zase nižší než & a ještě nižší má |… :) Happy bit-coding! :))
David Grudl #5
tak tak, závorkami programátor nic nezkazí. Pokud si nejsem na 100% jist, používám závorky. Chyby vzniklé jinou prioritou operátorů, než jaká se očekává, se totiž velmi špatně hledají.
A taky není špatné si vytisknout a mít po ruce tuto tabulku
Radek Hulán #6
#5 Davide Grudle, nejenom, že se tyto chyby špatně hledají, ale také je může nalézt až klient, nikoliv programátor nebo tester ;)
Tento článek byl uzavřen. Už není možné k němu přidávat komentáře.