「!==」と「==!」の違い [閉まっている]


162

昨日、誰かが書いたPHPコードを変更したとき、私はこれにつまずきました。単純な比較(if ($var ==! " "))が期待どおりに機能しないことに困惑しました。いくつかのテストを行った後、そのコードを書いた人は誰でも比較演算子の==!代わりに使用されていることに気付きました!==。私は==!どの言語でも見たことがなかったので、このコードが一体どのように機能するのか疑問に思い、いくつかのテストを行いました。

<?php
echo "int\n";
echo "1 !== 0: "; var_dump(1 !== 0);
echo "1 !== 1: "; var_dump(1 !== 1);
echo "1 ==! 0: "; var_dump(1 ==! 0);
echo "1 ==! 1: "; var_dump(1 ==! 1);
echo "bool\n";
echo "true !== false: "; var_dump(true !== false);
echo "true !== true: "; var_dump(true !== true);
echo "true ==! false: "; var_dump(true ==! false);
echo "true ==! true: "; var_dump(true ==! true);
echo "string\n";
echo '"a" !== " ": '; var_dump("a" !== " ");
echo '"a" !== "a": '; var_dump("a" !== "a");
echo '"a" ==! " ": '; var_dump("a" ==! " ");
echo '"a" ==! "a": '; var_dump("a" ==! "a");
?>

これにより、次の出力が生成されます。

int
1 !== 0: bool(true)
1 !== 1: bool(false)
1 ==! 0: bool(true)
1 ==! 1: bool(false)
bool
true !== false: bool(true)
true !== true: bool(false)
true ==! false: bool(true)
true ==! true: bool(false)
string
"a" !== " ": bool(true)
"a" !== "a": bool(false)
"a" ==! " ": bool(false)
"a" ==! "a": bool(false)

演算子はブール変数と整数変数に対しては機能するようですが、文字列に対しては機能しません。==!PHPのドキュメントや、検索エンジンの何についても見つけることができません(Google、Bing、DuckDuckGoを試してみましたが、リテラル文字列を検索する代わりに解釈しようとしているのではないかと思います)。誰かがこれを以前に見たことがあり、この行動に光を当てることができますか?


57
さあ...賛成票とは何ですか?このような質問をさらに12問作成できます。そして、準深刻な分析によってそれらを伴います。これは標準の教科書演習です。SOでは、娯楽や娯楽ではなく、質と情報に投票します。
sehe

51
@sehe彼はよく調査された質問の定義が理由で賛成票を得ています。彼は「回答を徹底的に検索」、「具体的に」、質問は「他の人に関連する」、「トピックについて」です。OPは物事を試し、彼が試みたことを私たちに示しました。このサイトが促進しようとしている種類の質問
JRaymond

11
@JRaymond:非常に理解しやすい問題と答えに対するトリビアの質問なので、彼は賛成票を得ています。雑学の側面は好奇心を高め、より多くの人々を駆り立てます。そして簡単な側面は、質問と回答を十分に理解して投票するのに十分な人々の割合を増やします。良い質問かどうかは関係ありません。
Thomas Bonini、2012

4
@JRaymond、それを認めて、賛成票の多い質問のほとんどは雑学です。他の多くの間でわたしのこれらの3つの質問を見てみましょう:123。それらのどれも(ほとんどの高い投票の質問とは異なり)グーグルで見つけることができるものではなく、それらはよく考えられ、書かれる前に試されます(私が知っている、私が書いたので)。ただし、専門知識を必要とする質問であるため、高い票を獲得することはありません。これが、ここでのシステムの動作方法です。
Shahbaz 2012

3
@JRaymond seheは正しいです。作家は、SOで実習を行います。このリスト(php.net/quickref.php)をたどって、関数が解決策である興味深い問題を考え出すことをお勧めします。状況または機能が不明瞭で興味深いほど、投票数は多くなります。
Mike B

回答:


243

違いは、演算子がないことです==!

この表現:

$a ==! $b

基本的にこれと同じです:

$a == (!$b)

10
うわー、こんなに短時間でたくさんの良い答え。私はそのことを明らかにした最初の答えを選びました!右側の変数に適用されるため、最も価値があります。他の人には申し訳ありません;)
ジェラルドシュナイダー

4
@Gerald Schneider:この答えを補うために最低限できることは、文法とフォーマットの点で他の答えと少なくとも同等になるようにこの答えを改善することでした(その1つは、非常に詳細な説明のために具体的に呼び出されました) !)。しかし、とにかく、私はそれを編集しました。
BoltClock

私はPHPでさえプログラミングしていませんし、「==!」2つの演算子「==」および「!」として読み取られます。それは、レイアウトの少しがあなたが何かを読む方法にどれほどの影響を与えることができるかを示すだけです。
StarNamer 2012

2
@Bang Dao Um、JavaScript?===と!==があります。しかし、==!
psr 2012

2
@BangDaoこれでw3foolsの別の理由が見つかりました。読んでください、それは重要です。
いくつかの

77

==!PHPには演算子はありません

そのわずかの組み合わせ==!。ここに存在する関連するオペレーターのみが==です。そのため、組み合わせ==!は通常どおり動作し==、確認してEquality、私を信頼します。

$variable_a ==! $variable_b 

に他ならない

$variable_a == (!$variable_b)

したがって;

"a" ==! " ": bool(false)
"a" ==! "a": bool(false) //is same as "a" == (!"a")

そして

true ==! false: bool(true)
true ==! true: bool(false)

複数の演算子文字を組み合わせると、常に演算子として機能しない場合があります。たとえば、=and を使用すると!!=orまたはのパターンの場合にのみ演算子として機能し!==ます。など!====、これらの文字には多数の組み合わせが存在する可能性があり !==!ます。演算子の組み合わせは、一意の形式一意の順序一意の組み合わせ(すべての文字が他のすべての文字と組み合わされない)であり、それらの間にスペースを入れないでください

以下の演算子リストを確認してください。

ここに画像の説明を入力してください


2
と同じような錯覚に陥りました<table>
チャドハリソン

+ほとんどそれはテーブルだと思っていました...しかし、実際にはそのイメージ
ババ

38

==! は演算子ではなく2つです。

== そして !

! よりも優先度が高い ==

そう :

"a" !== " ": bool(true) ->「a」は「」と実際には等しくないため、true

"a" ==! " ": bool(false) ->「a」は!と等しくないため、false! ""

==と!の間にスペースを入れて書くことができます。


1
false because "a" is not equals to !" "! ""はブール値にキャストして否定することを意味するため、 ""はtrueで、! ""はfalseです。
Zaffy

@quarryはい、私は説明の中にあまり深く入りませんでした:p
Michael Laffargue

29

==!そのように存在しません。それはやや不可解な表記です== !

これらの操作ではスペースは関係ないのでa --> b、と評価して評価するa-- > bと同じくらい簡単に書くことができますが、奇妙に見えます。

したがって、質問に関して"a" ==! " "は、に解析され"a" == !" "ます。文字列の否定はキャストによってカバーされます。これは、任意の文字列を意味しますが"0"" "キャストされた場合はtrueです。

したがって、式"a" == !" "は転送されます。

  1. "a" == !" "
  2. "a" == !false
  3. "a" == true

そして、とstring "a"bool true異なり、これは式全体をに評価しfalseます。

だから、物語の教訓は何ですか?スペースが足りない、または間違って配置されていることに混乱しないでください!:)


3
この回答で述べられているのとは異なり、空ではない文字列がブール値trueにキャストされるため、 "a" == trueはtrueと評価されます。式 "a" === trueはfalseと評価されます。
Pascal Rosin 2012

25

==!オペレーターではありません

==!php比較演算子ではありません-これは== !(スペースに注意)と同じです

すなわち

if ("a" !== " ") {
    // evaluates to true - "a" and " " are not equal
}

if ("a" == !" ") {
    // unreachable
} else {
    // evaluates to false - "a" is not equal to true (!" " evaluates to true)
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.