演算子の優先順位のはなし(&&と=の場合)

大した事でも無いのですけど

PHP

 

if($str_foo = hoge() && $str_bar = huga() && $str_baz = piyo())

 

と条件式の中で代入してみたら$baz以外が全て空文字列になってしまいました。

 

あれれ、と思って優先順位を調べてみると、代入より&&のほうが優先順位が高いのでした。

PHP: 演算子の優先順位 - Manual

http://php.net/manual/ja/language.operators.precedence.php

 

 

なので、

 

かっこでくくっちゃうか、

if( ($str_foo = hoge()) && ($str_bar = huga()) && ($str_baz = piyo()) )

代入より優先順位の低いandを使って

if($str_foo = hoge() and $str_bar = huga() and $str_baz = piyo())

 

と書くと大丈夫です。

 

最初の結果は変数の$str_○○が全部未定義だったので、

hoge() && $str_bar //FALSE

が先に評価されて$str_fooに代入される。次に、

huga() && $str_baz //FALSE

が評価されて$str_barに代入される。

最後に、$str_bazにpiyo()が代入される。

 

というからくりだったようです。

hoge() && $str_bar

を評価した後に

$str_bar = (huga() && $str_baz)

が評価されるなんて、四則計算に慣れてると$str_barが2回計算されてるみたいでちょっと奇妙ですけどね。

 

余談ですが、この記事書くために調べ物してたどり着いたものが面白かったので。

6÷2(1+2)=9と発表しているバカガジェット通信

普段はあんまり意識しませんが、a✕bよりabが優先順位高いのです。