[模擬問題] PHP8初級 – 比較演算子(CTO古庄道明からの出題)

こんにちは。PHP技術者認定機構 CTOの古庄道明です。
今日もPHP8初級試験の模擬問題と解説を紹介します。
以下を解いて出題のイメージと知識を補っていただけると幸いです。

目次

問題

次のコードの【 A 】に入れた場合にtrueが返される組み合わせとして正しいものはどれか。

if (【 A 】) {
    print("true");
} else {
    print("false");
}

【1】”php” > “perl”
【2】0 != “0”
【3】5 – 6 + 1
【4】”false”
【5】0 + false
【6】”543a” < 56 【7】abs(-6) > 10 / 2

選択肢

選択肢1
【1】【4】

選択肢2
【6】【7】

選択肢3
【1】【4】【6】

選択肢4
【1】【2】【4】【7】

選択肢5
【1】【4】【6】【7】

回答と解説

問題は「比較演算子について」です。
ただ、加えて「暗黙の変換」などいくつかの知識が必要になる箇所があるので、注意しながら解説をしていきましょう。

問題にある各演算子が、boolとしてどんな評価になるかを確認していきます。

まず【1】の “php” > “perl” ですが、これは「文字列の比較」になります。
文字列の比較を < や > の比較演算子で比較する場合は、バイト列の辞書順(lexicographical order)で比較されます。
アルファベットの場合は「アルファベット順」と覚えておくと理解しやすいでしょう。大文字小文字は「大文字のほうが小さい、小文字の方が大きい」となります。ASCIIコード表を見るとよいでしょう。
今回の比較の1文字目はどちらもpのため、2文字目の比較に移ります。
2文字目は “h” と “e” ため、”h” のほうが後にくる文字なので「大きい」となるので、”php” > “perl” の比較式は「true」となります。
ちなみにマルチバイト文字の比較についても内部の数値(バイト列)で比較されます。
コンピュータの世界では、最終的に「あらゆるものはバイナリ(数値)になる」ことを理解しておくとよいです。

次に【2】の0 != “0”についてです。
!=(緩やかな比較)の場合、左右辺の型が異なる時には、型を合わせてからの比較になります。
https://www.php.net/manual/ja/language.operators.comparison.php
「オペランドが両方 数値形式の文字列 の場合、 もしくは一方が数値で、もう一方が 数値形式の文字列 の場合、 比較は数値として行われます」のルールがあるため、上述は結果的に0 != 0
の比較となります。そのため、式はfalseとなります。

【3】 の 5 – 6 + 1 についてです。
まず 5 – 6 + 1 は、数値計算なので、答えは0になります。
if文の条件式( ()の中身 )は最終的にbool値として評価されるため、今回は0が、暗黙的にbool型にキャストされます。
https://www.php.net/manual/ja/language.types.boolean.php#language.types.boolean.casting
にありますが、数値の0はfalseと見なされます。
そのため、式はfalseとなります。

【4】の “false” についてです。
こちらも【3】と同様、暗黙的にbool型にキャストされます。
ここが勘違いしやすいところなのですが、”false”は「falseという5文字が書かれている文字列」です。
文字列において、boolへのキャストでfalseになるのは「空の文字列 “”、 および文字列の “0”」だけです。
そのため「文字列としての “false”」をboolにキャストすると、trueになります。
そのため、式はtrueとなります。

【5】の 0 + false についてです。
これについては
https://www.php.net/manual/ja/language.types.type-juggling.php
の「数値のコンテクスト」にある以下の文章がベースになります。
「これは、 算術演算子 を使った場合です。
このコンテクストでは、 オペランドのどちらかが float (または整数と解釈できない場合) の場合か、 両方のオペランドが float の場合、 結果の型は float になります。 そうでない場合、オペランドは整数として解釈され、 結果の型も整数になり
ます。」
また、falseを整数にする状況についてはhttps://www.php.net/manual/ja/language.types.integer.php#language.types.integer.casting
にある通り「false は、0 (ゼロ) となり、 true は、1 となります。」のため、falseは0に変換されます。
ここから、式は 0 + 0 となるため答えは0となります。
if文の条件式( ()の中身 )は最終的にbool値として評価されるため、【3】と同様の機構となります。
そのため、式はfalseとなります。

【6】の”543a” < 56 についてです。
こちらは、まずはじめに「PHP8からの変更」を踏まえる必要があります。
https://www.php.net/manual/ja/migration80.incompatible.php
「(厳密でないやり方で)数値と非数値形式の文字列を比較する場合、 数値を文字列にキャストし、文字列と比較するようになりました。」”543a” は先頭が数字ですが、PHPの定義では「numeric string(数値形式の文字列)
」ではありません。
「numeric string(数値形式の文字列)」については以下のマニュアルを参照してください。
https://www.php.net/manual/ja/language.types.numeric-strings.php
そのため、”543a” < 56 の比較式は “543a” < “56” となります。
次に。1文字目はどちらも”5″であるため同じ、2文字目は”4″と”6″のため、”6″の方が大きくなります(【1】参照)。
そのため “543a” < 56 の式はtrueとなります。

【7】のabs(-6) > 10 / 2 についてです。
abs()は「絶対値を求める」関数です。
https://www.php.net/manual/ja/function.abs.php
そのため、abs(-6) は 6 になります。
一方の右辺は 10 / 2 なので、5になります。
従って abs(-6) > 10 / 2 は 6 > 5 となります。
式はtrueとなります。

問題文に戻ってみましょう。
「次のコードの【 A 】に入れた場合にtrueが返される組み合わせとして正しいものはどれか。」
なので、trueになっているものを抜き出します。

【1】
【4】
【6】
【7】

選択肢で上述を満たすのは選択肢5となるため、解答は5になります。

PHP8初級試験と公式問題集に興味がある方は、以下のページをご覧のうえ、この機会に是非受験ください。

PHP8初級試験
https://www.phpexam.jp/summary/novice8

公式問題集:PHP8技術者認定初級試験公式問題集A
Kindle版 https://amzn.asia/d/1bS88y9
ペーパーバック版 https://amzn.asia/d/3P3Izeu

また、試験対策セミナーは毎月開催しています。興味がある方は以下のページをご覧
いただき是非セミナーにもご参加ください。(フォローいただけるとセミナーのご案
内が届くようになります)

PHP技術者認定機構の公式Peatixグループ
https://peatix.com/group/43424

www.phpexam.jp

この記事が気に入ったら
いいね または フォローしてね!

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次