人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

以下の式がfalseになるのはなぜですか?

0 + "true"

PHPのプログラミングの勉強をしています。テキストの演習問題で、0+"true"の式がtrueかfalseかという問題があり、解答はfalseだったのですが、解説がなくどうしてfalseになるのか分かりません。
まず、数値と文字式が+で結ばれているときにどう考えていいのかが分かりません。

よろしくお願いします。

●質問者: blueman1987
●カテゴリ:ウェブ制作
✍キーワード:PHP テキスト プログラミング 勉強 解説
○ 状態 :終了
└ 回答数 : 2/2件

▽最新の回答へ

1 ● うぃんど

phpは緩やかな比較(詳細は資料1参照)を行うため結果がゼロとなる数式はfalse、ゼロ以外ならtrueという判定を下してしまいます

<?php
if (0 + "true") { echo 'A '; } else { echo 'B '; }
if (0 + "false") { echo 'A '; } else { echo 'B '; }
if (1 + "true") { echo 'A '; } else { echo 'B '; }
if (1 + "false") { echo 'A '; } else { echo 'B '; }
if (2 + "true") { echo 'A '; } else { echo 'B '; }
if (2 + "false") { echo 'A '; } else { echo 'B '; }

上記の実行結果

B B A A A A 

式の結果が厳密にブーリアン(trueかfalseのどちらか)であるかどうかを判定したい場合は!==や===による厳密な比較が必要となります

<?php
if (0 + "true" === true) { echo 'A '; } else { echo 'B '; }
if (0 + "true" === false) { echo 'A '; } else { echo 'B '; }
if (1 + "true" === true) { echo 'A '; } else { echo 'B '; }
if (1 + "true" === false) { echo 'A '; } else { echo 'B '; }

いずれの式も結果は数値となる(phpは値が文字列であっても極力数値に変換する努力をする:資料2参照)ためifの判定結果は下記のとおり

B B B B 

資料1 http://www.php.net/manual/ja/types.comparisons.php

資料2 http://www.php.net/manual/ja/language.types.type-juggling.php

◎質問者からの返答

ご回答どうもありがとうございます。皆様のご回答により理解することができました。


2 ● saddeph
ベストアンサー

多くの言語には、プログラマがいちいち値の型を変換する手間を省くため、空気を読んで自動で変換する機能がついています。PHPの中で 0 + "true"という式がどのように変換されているかを、マニュアルの記述を見ながら追っていきます。


PHP の自動型変換の例の一つは、加算演算子 '+' です。 オペランドのどれかが float の場合、全てのオペランドは float として評価され、結果は float になります。 その他の場合、オペランドは整数として解釈され、結果も整数になります。

PHP: 型の相互変換 - Manual

ここには、

と書いてあります。


0 + "true"

には小数が含まれていませんから、整数の0はそのままで、"true"は整数に変換されることになります。


では、"true"という文字列が整数に変換されるとどうなるかというと

数値として文字列が評価された時、結果の値と型は次のように定義されます。


文字列の中に '.' や 'e'、'E' といった文字が含まれず、 数値が integer 型の範囲内 (PHP_INT_MAX で定義されています) におさまる場合は integer として評価されます。それ以外の場合は、すべて float として評価されます。


文字列の最初の部分により値が決まります。文字列が、 有効な数値データから始まる場合、この値が使用されます。その他の場合、 値は 0 (ゼロ) となります。有効な数値データは符号(オプション)の後に、 1 つ以上の数字 (オプションとして小数点を 1 つ含む)、 オプションとして指数部が続きます。指数部は 'e' または 'E' の後に 1 つ以上の数字が続く形式です。

PHP: 文字列 - Manual

"true" の一文字目は符号(+/-)でも数値でもありませんから、整数に変換されると 0 になります。


つまり、

0 + "true"

は、PHPでは

0 + 0

と変換して計算されます。


さらに、0が論理型(boolean / trueかfalseの値を持つ型)に変換されると、

boolean に変換する場合、次の値は FALSE とみなされます。

その他の値は全て TRUE とみなされます (全ての resourceを含みます)。

PHP: 論理型 (boolean) - Manual

より、false になることが分かります。


0 + "true" が false 扱いになるのはこのようなルールによるものです。


ちなみに、0 + "false" や 0 + "apple" なども、有効な数値データから始まる文字列ではありませんから true/false の型に変換されると同様に false になります。

また、0 + true (""で括っていないことに注意) だと、

FALSE は、0 (ゼロ) となり、 TRUE は、1 となります。

PHP: 整数 - Manual

という変換ルールから、0 + 1 = 1と解釈され、1 はtrue/false の型に変換されると true になります。

◎質問者からの返答

ありがとうございます。

>文字列の最初の部分により値が決まります。文字列が、 有効な数値データから始まる場合、この値が使用されます。その他の場合、 値は 0 (ゼロ) となります。

この部分が理解できていませんでした。大変勉強になりました。

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ