“ ! = =”和“ = = !”的区别

昨天我在修改别人编写的 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,但我怀疑他们试图解释它,而不是搜索字符串)。以前有人见过这种情况吗? 能解释一下这种行为吗?

8577 次浏览

==!不是一个运营商,而是两个:

==!

优先级高于 ==!

所以:

为真,因为“ a”实际上不等于“”

为假,因为“ a”不等于

可以在 = = 和! 之间加一个空格。

= = ! 不是运算符

==!根本不是一个 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)
}

区别在于没有操作符 ==!

这个表达:

$a ==! $b

基本上和这个是一样的:

$a == (!$b)

==!并不存在,它是 == !的一种比较隐晦的表示法

因为空格在这些操作中并不重要,所以您可以很容易地编写 a --> b,它的计算结果是 a-- > b,但是看起来会很奇怪。

因此,对于这个问题: "a" ==! " "将被解析为 "a" == !" "。字符串的否定被 选角覆盖,这意味着除了 "0"" "以外的任何字符串在转换时都是 true

因此,表达式 "a" == !" "将被转移:

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

而且,由于 string "a"bool true不同,因此它将整个表达式计算为 false

那么,这个故事的寓意是什么呢? 不要让自己因为错过或放错了空格而感到困惑! :)

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)

组合多个运算符字符不一定总是作为运算符使用。例如,如果我们取 =!,它只有在 !=!==的模式下才作为操作符工作。这些字符可以有很多组合,比如 !====!==!等等。等等。操作符组合应该在 独特的格式独特的秩序独特的组合(所有字符不会与所有其他字符组合) ,并肯定,他们之间没有任何空间

检查下面的操作员名单;

enter image description here