0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

あなた = !あなた あなたは誰?論理否定boolean

Posted at
$ohayou = !$ohayou

こんばんは!

そんな訳はない。

でもboolean型の!trueはfalseになるんだ!

これを見た時、

凄い新鮮だった。
trueとfalseは評価でしか利用してこなかった。

だからtrueはDBに保存されたデータであり、
データのtrueが否定された時に、反転してfalseになる??!
とおおぉと驚いたのだ。

自分の中で、trueをfalseに変換する時は下記をイメージしていた。

if($A = true){
    $A = false
}else{
    $A = true
}

まさか

$A = !$A

これだけで良いなんて思いもしなかった。
trueの反対がfalseと認識されるのが新鮮だった。

ということで調べてみた。

古典論理の基本的な挙動

プログラミング言語はtrueかfalseのどちらかだけをとるという論理体系を基本ルールとしている。

Cなどの言語では整数値をそのままブールとして解釈する歴史的理由があり

0をfalse
それ以外の値をtrue

というルールで評価する。

PHPのブール値以外の値が否定された時のルール

PHPではboolean型以外の型でも!演算子で評価する時に、自動的にtrueかfalseに変換される。

ifで評価した時もtrueかfalseに変換されている。

これを型の自動変換、型の強制(type juggling)という。

falseとなる値は以下

  • false
  • 整数0
  • 文字列"0"
  • 空文字""
  • 空の配列array()
  • NULL

上記の内容以外はtrueとなる。

==と===の違い

== は等価演算子
型変換しながら比較する。

=== は厳密比較演算子
型も含めて比較する。

これを用いると

true == 1 

これは同等とみなす。

true === 1

これは型が違うのでfalse

となるようだ。

DBにおける真偽値の保存はデータ

DB上でboolean型で格納した場合は下記で保持される。

trueは内部的には1かt
falseは0かf

この段階ではプログラム上の真偽評価とは別物。

この値をPHPなどで取り出す時に変数にtrueというブール値がセットされるらしい。

結局!trueがなぜfalseなのか

遠回りしたが

なぜ!trueでfalseになるのか。

これは論理否定演算子が

そう変えるものだ
と定義されているから。

という結果だった。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?