こんにちは。アライドアーキテクツの金箱(かねばこ)です。
いきなりですがソースコードを書きます。言語はPHPです。
1 2 3 4 5 |
$result = false || true; $result = false or true; $result = true && false; $result = true and false; |
and と && は論理和を、or と || は論理積を意味します。
この式の実行結果はどうなると思いますか?
閑話休題。PHPでふと何気なく書いてしまったところ、期待した結果が返ってこない
・・・なんて時があったりします。
PHPをはじめプログラム言語には一文字一文字にきちんと意味があります。
意味を正しく理解することで品質の高いプログラムが書けるのだと思います。
さて冒頭のプログラムの実行結果です。
1 2 3 4 5 6 |
$result = false || true; var_dump($result); //bool(true) $result = false or true; var_dump($result); //bool(false) |
1 2 3 4 5 6 |
$result = true && false; var_dump($result); //bool(false) $result = true and false; var_dump($result); //bool(true) |
論理和と論理積の説明だけではありえない実行結果が返ってきていることが分かります。
なぜこのような結果になるかというと、タイトルにある演算子の優先順位が関係します。
PHPのドキュメントを見てみます。(http://php.net/manual/ja/language.operators.precedence.php)
演算子の優先順位と題された表がありますが、上あるほど優先順位の高い演算子です。
注目すべきは、&&とand、そして||とorの優先順位が違うところです。
実は、andとorは代入演算子(=とか)よりも優先順位が低いんです。
最初の式をおさらいしてみます。
1 |
$result = false || true; |
この式は分かりやすく表現すると次のように解釈されます。
1 |
$result = (false || true); |
一方で、
1 |
$result = false or true; |
この式は、次のように解釈されます。
1 |
($result = false) or true; |
※丸括弧は優先順位を明示的に表現しています。
このように解釈されるために、冒頭のソースコードの実行結果が異なったわけです。
頭の中で=(イコール)は右辺を計算した後に左辺に代入すると思っていると、思わぬミスを誘発するので注意が必要です。
次の実行結果も注目すべきものだと思います。使いようによっては、とても便利に使えます。
1 2 3 4 5 6 |
$boo = 0 || $boo = 'boo'; print($boo); //1 $boo = 0 or $boo = 'boo'; print($boo); //boo |
個人的にはあまりandとorを使う機会はありませんが、めちゃくちゃ良い使い方を知っている方はぜひ教えてください。
アライドアーキテクツでは、一緒に働く仲間を随時募集しています。andとorの使い方にはちょっとうるさい方は、ぜひ一度採用サイトを覗いてみてください。
サービスのことを考えることと、グロースを考えることが大好きです。 どんどん世の中が便利になってうれしいです。 どうぞよろしくお願いします。