Na navigaci | Klávesové zkratky

Translate to English… Ins Deutsche übersetzen…

PHP hádanka V.

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

  1. 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. :-)

    před 12 lety | reagoval [4] Adam Hošek
  2. 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 ;)

    před 12 lety
  3. pavel #3

    Kua ne bitove ale porovnavaci ;)

    před 12 lety
  4. Adam Hošek http://mamuf.bloguje.cz #4

    avatar

    #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! :))

    před 12 lety
  5. David Grudl http://davidgrudl.com #5

    avatar

    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

    před 12 lety | reagoval [6] Radek Hulán
  6. Radek Hulán http://hulan.info/ #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 ;)

    před 12 lety

Tento článek byl uzavřen. Už není možné k němu přidávat komentáře.