PHPの二重否定(!!)演算子


188

PHPでdouble not演算子は何をしますか?

例えば:

return !! $row;

上記のコードは何をしますか?


32
これは基本的に同じですreturn (bool) $row;
WildlyInaccurate

5
私はそれらのうちどちらが速いか疑問に思っていました、そして私たちは勝者として(ブール)を持っています。i.stack.imgur.com/dcnsM.png
Binod Kalathil

1
@Binodは、情報を提供するのに役立つ情報です。
Robin K

回答:


290

これは「double not演算子」ではなく、2回適用されるnot演算子です。右に!すると、オペランド関係なくブール値になります。次に、左!はそのブール値を否定します。

つまり、真の値(ゼロ以外の数値、空でない文字列と配列など)の場合はブール値が取得さTRUEれ、偽の値(0、0.0 、、NULL空の文字列または空の配列)の場合は取得されます。ブール値FALSE

これは、機能的に次のキャストと同等booleanです。

return (bool)$row;

22
「double-not-operator」または「double not-operator」は、読み方によって異なります。
nickf 2010年

9
@nickfではありませんが、「double not演算子」は、not演算子を2回使用する行為ではなく、1つの演算子を指します。
Theo

3
@テオ、それは実際には1つの演算子ですか?この場合、通訳は!!等しいと見なし(bool)ますか?または、どちらを使用するかによって異なるマシンコードが実行されますか?
Pacerier 2015年

これはJavaScriptでも機能します。JavaScriptの偽の値のリストとPHP
Jomar Sevillejo

1
いくつでも使えます。'bangs'(感嘆符)の数が奇数の場合、NOT演算はと同じ!valueであり、偶数のbangがある場合、と同じ(bool) valueです。
diamondsea

51

boolにキャストするのと同じ(またはほぼ同じ-いくつかのコーナーケースがあるかもしれません)。場合$rowでしょうがtrueにキャストし、その後!! $rowも同様です。

しかし、達成したい(bool) $row場合は、おそらくそれだけを使用し、「興味深い」式は使用しないでください;)


2
他のプログラミング言語でこのようなものを見たことはありません。
Andrei

16
使用!!は、C(++)でのプログラミングに残る習慣です。Cでは、キャストを行うのはPHPほど簡単ではありません。さまざまな問題が発生したり、警告がコンパイルされたりする可能性があり!!ます。したがって、を使用してキャストすることはできません。
NikiC 2010

1
@nikic-それは奇妙に聞こえます、IMO ... operator!オーバーロード可能であるため、それを使用C++すると危険です。また、Cで構造体をキャストしたり!、それらを使用したりすることはできません。また、何かを否定できる場合は、intを返す関数からそれを返すことができる可能性が高く、これはほとんどブール値になります。Cの話をしているのですか?
-viraptor

2
私は見た !!多くのCプログラムでは、1/0への安全な変換として。(ブール値は実際にはCでは0 / "ゼロ以外"にすぎません。)
Falken教授、2013

1
@viraptorは、!!あなたが主張したように「興味深い」ものではありません。CからJavaScriptに至るまで、あらゆる場所にあります。
Pacerier 2015年

18

つまり$row真の値がある場合はを返しtrue、それ以外の場合falseはブール値に変換します。

これは、php docsからブール変換への式の例です。

Expression             Boolean
$x = "";               FALSE
$x = null;             FALSE
var $x;                FALSE
$x is undefined        FALSE
$x = array();          FALSE
$x = array('a', 'b');  TRUE
$x = false;            FALSE
$x = true;             TRUE
$x = 1;                TRUE
$x = 42;               TRUE
$x = 0;                FALSE
$x = -1;               TRUE
$x = "1";              TRUE
$x = "0";              FALSE
$x = "-1";             TRUE
$x = "php";            TRUE
$x = "true";           TRUE
$x = "false";          TRUE

7

「ない」は、言語が式の結果に割り当てる真理値を理解するために、多くの言語で便利な方法です。たとえば、Pythonでは次のようになります。

>>> not not []
False
>>> not not [False]
True

複雑な値を「値はありますか?」のような値に減らしたい場合に便利です。


1

別のより人間的な、おそらくより簡単な、「読まない」方法:

  • 最初 '!' 2つのことを行います:値をブール値に「変換」してから、その反対を出力します。したがって、値が「偽の」値である場合はtrueになります。

  • 二番目 '!' 最初のものの反対を出力するだけです。

つまり、基本的に、入力値は何でもかまいませんが、文字列かもしれませんが、ブール出力が必要なので、最初の '!'を使用します。この時点で、入力値が 'falsy'のときにTRUEにしたい場合は、ここで停止し、単一の '!'を使用します。それ以外の場合、入力値が「truthy」のときにTRUEにしたい場合は、別の「!」を追加します。


0

を見ようよ

!$a;

解釈するのではなく!演算子として

右側の値の反対のブール

読んだ

ブール反対取る表現をその右に

この場合

$a;

式かもしれません

そうです

!$a;

そうです

!!$a;

そして

!!!$a;

これらはそれぞれ有効な式なので、!演算子をそれぞれに追加できます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.