PHPの問題です
次のプログラムの実行結果が変わらないようにソースコードから1文字削除するとき、削除できる文字は何通りある?
【選択肢】
A. 3通り
B. 5通り
C. 7通り
【考え方】このソースコードを実行すると、「1」という値が出力されます。なぜこの値が出力されるのかを考え、削除できる文字を探してみてください。
・・・
他のプログラミング言語でプログラムを作った経験があっても、PHPでの開発に取り組もうとしたときに、PHPの特殊な記号に戸惑ってしまうことは珍しくありません。今回はPHPで使われる演算子についてクイズを出題しました。
以下の3つのヒントを手がかりに挑戦してみてください。
ヒント1:使われている記号
冒頭の「<?php」はPHPのソースコードであることを意味し、次の「echo」は文字を出力するものです。問題なのは残りの部分でしょう。まずはこのプログラムで使われている記号について解説します。
■「<<」と「>>」ビット演算子
左端にある「<<」と、右端にある「>>」はビット演算子と呼ばれる記号で、数値の桁を左右にシフトする演算子です。数値を2進数で考えたときに、その桁を動かすものです。
たとえば、「5<<2」と書くと、「5」を2進数で考えたときに、その桁を2つ左にシフトすることを意味します。このとき、右側には「0」を埋めます。
5は2進数で「101」なので、2つ左にシフトすると「10100」です。これを10進数に戻すと「20」になります。このように、1桁シフトすると2倍、2桁シフトすると4倍、3桁シフトすると8倍になる、という演算子です。
逆に、右シフト(>>)の場合は、1桁シフトすると1/2倍、2桁シフトすると1/4倍、3桁シフトすると1/8倍となります。
■「<=>」宇宙船演算子
次に使われている「<=>」は宇宙船演算子と呼ばれる記号で、三方比較演算子とも呼ばれます。
C++などのプログラミング言語でも同様で、「A<=>B」と書いたとき、「A<B」なら-1を、「A==B」なら0を、「A>B」なら1をそれぞれ返す演算子です。
■「??」NULL合体演算子
そして、「??」はNULL合体演算子と呼ばれる記号で、この左側がNULLだったときに右側の値を返し、NULL以外のときは左側の値を返します。
つまり、「A??B」と書いたとき、AがNULLならBを、AがNULL以外ならAを返します。
■「<>」比較演算子
その次にある「<>」は「等しくない」ことを意味する比較演算子で、条件分岐の条件としてよく使われます。PHPでは、「!=」だけでなく、この「<>」も使えます。
ヒント2:演算子の優先順位
上記のような演算子の組み合わせで実現されているソースコードですが、どの順番でそれぞれの演算子を評価するのかが問題を解く鍵になります。一般的には、他人が見たときに読みやすいように括弧を使いますが、その優先順位を知っておきましょう。
PHPでは、演算子の優先順位が以下のサイトで定められています。
https://www.php.net/manual/ja/language.operators.precedence.php
ここから今回の問題に関係しそうな部分を抜き出すと、次の表のようになります。
数学で足し算や引き算よりも先に掛け算や割り算をすることを考えると、この表で上にあるものを優先して処理する、ということです。つまり、「*」や「/」があると最優先で処理します。
ヒント3:型の自動変換
今回は上記のような計算や比較の結果を「echo」で文字列として出力しています。このとき、型の自動変換が行われます。今回は「1」が出力されるものですが、実際には「true」を出力しようとして、自動的に「1」が出力されています。
このとき、「false」なら「0」が出力されるように考える人がいるかもしれませんが、実際は違います。試しに次のソースコードを実行して、その結果を確認してみましょう。
<?php
echo true;
echo false;
ヒントは以上です。さあ正解はわかりましたか?
解答・解説はこちらから