“!==”和“ ==!”之间的区别 [关闭]


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
来...赞成票是什么?我可以再提出更多这样的问题。并陪伴他们进行认真的分析。这是标准教科书练习,不。在SO中,我们投票的是质量和信息,而不是娱乐和娱乐。
sehe 2012年

51
@sehe他正在投票,因为它是一个经过精心研究的问题的定义-他“一直在努力地寻找答案”,“变得具体”,该问题与“其他人相关”并且是“正题”。OP尝试了一些事情,并向我们展示了他的尝试;这是这个网站试图
激发

11
@JRaymond:他正在投票,因为这是一个琐碎的问题,非常容易理解问题和答案。琐事方面增加了好奇心,驱使更多的人参与其中,而简单方面增加了理解该问题和答案的人所占的百分比。这与它是否是一个好问题无关。
Thomas Bonini 2012年

4
@JRaymond,承认这一点,大多数高票问题都是琐事。看看我的这三个问题在许多其他:123。它们都不是您只能在Google上找到的东西(与大多数高投票题不同),并且在编写之前都经过了深思熟虑和尝试(我知道,因为我写了它们)。但是,由于它们是需要专业知识的问题,因此他们永远不会获得高票。这就是这里系统的工作方式。
Shahbaz 2012年

3
@JRaymond sehe是正确的。作家将在SO上度过美好的一天。我建议浏览此列表(php.net/quickref.php),并提出一些有趣的问题,其中函数是解决方案。情况或功能越模糊和有趣,票数就越高。
Mike B

Answers:


243

区别在于没有运算符==!

该表达式:

$a ==! $b

基本上是这样的:

$a == (!$b)

10
哇,这么短的时间内有很多好的答案。我选择了第一个明确的答案!适用于右侧变量,因此具有最大价值。对不起其他人;)
Gerald Schneider

4
@Gerald Schneider:您至少可以弥补它的问题是改进此答案,以便它在语法和格式方面至少与其他答案同等(您特别呼吁其中一个以提供非常详细的解释) !)。但是无论如何,我现在已经对其进行了编辑。
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

==! 不是运算符,而是两个:

==!

! 优先级高于 ==

所以:

"a" !== " ": bool(true) ->正确,因为“ a”实际上不等于“”

"a" ==! " ": bool(false) ->否,因为“ a”不等于!

可以用==和!之间的空格编写。


1
false because "a" is not equals to !" "!“”表示强制转换和否定“。”为真,!“”为假。
Zaffy 2012年

@quarry是的,我在解释中没有做太多事情:p
Michael Laffargue 2012年

29

==!根本不存在。这是一个有点神秘的符号== !

由于空格在这些操作中无关紧要,因此您可以轻松编写a --> b,其结果为a-- > b,但看起来很奇怪。

因此,关于这个问题:"a" ==! " "将被解析为"a" == !" "。字符串的否定是由覆盖铸造,这意味着任何字符串,但"0"" "是,铸造时true

因此,表达式"a" == !" "将被传输:

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

而且,与的不同之处string "a"在于bool true,此表达式将整个表达式求值为false

那么,这个故事的寓意是什么?不要让自己被丢失或错误放置的空间所迷惑!:)


3
与此答案中所述不同,“ a” == true的计算结果为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)
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.