派遣で働くエンジニアのスキルアップを応援するサイト

PRODUCED BY RECRUIT

【PHPクイズ】演算子の優先順位は?【解答・解説】

この記事は、2024年2月16日に配信した「【PHPクイズ】演算子の優先順位は?」の解説です。まだ問題を解いていない方は、こちらからご覧ください。

・・・

今回の問題は、PHPで使われる特殊な演算子と、その優先順位について考えるものでした。

正解は B. 5通り です。

パズルのような問題で、少し難しかったという人もいるかもしれませんね。ここからは、どの文字を削除したときに結果が変わるのか、1つずつ確認してみましょう。

問題文の式の優先順位を明確にする

問題文に登場する演算子について、ヒントで紹介した表(演算子の優先順位)をもとに括弧を追加すると、問題文のソースコードは次のように書き換えられます。

<?php
echo ((1<<1)<=>1)??(1<>(1>>1));

つまり、「??」の左側がNULLでない場合は左側の値を出力します。この左側は「1<<1」を計算すると2となり、「2<=>1」は左の方が大きいため「1」を返します。これにより、「1」が出力されるわけです。

これをもとに、今回の問題である「ソースコードから1文字削除する」ということを考えます。

右半分を考える

上記の計算結果を見ると、「??」の右側は使っていません。つまり、次の赤字部分は式が変わっても影響はありません。ただし、式として成立している必要があります。

<?php
echo 1<<1<=>1??1<>1>>1;

これを左から1文字ずつ消してみます。

<>1>>1 ← 式として成立しない
1>1>>1 ← 式として成立する
1<1>>1 ← 式として成立する
1<>>>1 ← 式として成立しない
1<>1>1 ← 式として成立する
1<>1>1 ← 式として成立する
1<>1>> ← 式として成立しない

つまり、この部分は4通りです。そして、当然のことながら、いずれも結果は変わりません。

左半分を考える

次に、「??」の左側を考えます。これは、条件式となっているだけでなく、1という結果を返します。つまり、この部分が「1」になる必要があります。そこで、1文字だけ消しても条件として成り立ち、結果が変わらないものを考えます。

左端から順に1文字ずつ消してみると、次のようになります。

<<1<=>1 ← 式として成立しない
1<1<=>1 ← 式として成立する(-1を返す)
1<1<=>1 ← 式として成立する(-1を返す)
1<<<=>1 ← 式として成立しない
1<<1=>1 ← 式として成立しない
1<<1<>1 ← 式として成立する(1を返す)
1<<1<=1 ← 式として成立する(何も出力しない)
1<<1<=> ← 式として成立しない

つまり、この部分で式として成立するのは4通りありますが、結果が変わらないのは1通りです。それぞれについて、もう少し詳しく見てみましょう。

まずは「1<1<=>1」となる場合です。これは2通りありますが、宇宙船演算子の左がシフト演算から比較演算に変わっています。しかし、優先順位は変わらず、「(1<1)<=>1」という処理です。そして、この左に「1<1」は条件を満たしませんのでfalseとなります。そして、falseと1を宇宙船演算子で比較すると、「-1」を返します。詳しくは、PHPでの型の比較をご覧ください。

https://www.php.net/manual/ja/types.comparisons.php

そして、「1<<1<>1」については、ビット演算が優先なので「(1<<1)<>1」という処理です。この左の「1<<1」はビット演算で2となり、「2<>1」はtrueとなります。そして、これを出力するときは、次の処理と同じで、「1」を出力します。つまり、ヒントでも紹介したように、「true」は「1」と出力されるのです。

<?php
echo true;

最後の「1<<1<=1」についてもビット演算が優先なので「(1<<1)<=1」となります。この左は2なので「2<=1」となりfalseです。NULL合体演算子の左側がfalseになるため、このfalseを出力するわけです。

PHPでは「echo true」は「1」を出力するのは上記の通りですが、「echo false」は何も出力しません。つまり、以下のソースコードは何も出力しないのです。

<?php
echo false;

その他の部分を考える

その他、冒頭の「<?php」や「echo」、最後の「;」、そして途中の改行や空白のうち、削除できるものを考えます。ただ、これらはいずれも削除すると動きません。改行をスペースに置き換えたり、スペースを改行に置き換えたりすることはできますが、削除はできないのです。

このため、答えは「B. 5通り」であることがわかります。

・・・

いかがでしたか?今回は、PHPのビット演算子や宇宙船演算子、NULL合体演算子のほか、比較演算、演算子の優先順位、異なる型での比較、文字出力時の型の自動変換などさまざまなものを組み合わせた問題でした。

業務で使う場合は異なる型での比較を避けるなど、できるだけ不具合が起きにくいような開発が必要ですが、PHPが持つ演算子の特徴などを知っておくと意外なところで役立つかもしれません。

【出題者】増井 敏克さん
増井技術士事務所代表。技術士(情報工学部門)。情報処理技術者試験にも多数合格。ビジネス数学検定1級。「ビジネス」×「数学」×「IT」を組み合わせ、コンピュータを「正しく」「効率よく」使うためのスキルアップ支援や、各種ソフトウェアの開発、データ分析などを行う。著書に『Pythonではじめるアルゴリズム入門』『図解まるわかり プログラミングのしくみ』『「技術書」の読書術 達人が教える選び方・読み方・情報発信&共有のコツとテクニック』、最新刊の『実務で使える メール技術の教科書』(以上、翔泳社)がある。

リクルートスタッフィング