PHP中的双非(!!)运算符

Posted

技术标签:

【中文标题】PHP中的双非(!!)运算符【英文标题】:Double not (!!) operator in PHP 【发布时间】:2011-01-08 19:03:54 【问题描述】:

not运算符在php中的作用是什么?

例如:

return !! $row;

上面的代码会做什么?

【问题讨论】:

这与return (bool) $row;基本相同 我想知道哪个更快,我们有 (bool) 为赢家。 i.stack.imgur.com/dcnsM.png @Binod 这是一个很好的信息,谢谢! 【参考方案1】:

让我们看看

!$a;

而不是解释!运算符作为

右侧的布尔值

阅读

表达式 的布尔值放在其右侧

在这种情况下

$a;

可能是一个表达式

原来如此

!$a;

原来如此

!!$a;

!!!$a;

等等,因为每个都是有效的表达式,!运算符可以添加到它们每个前面。

【讨论】:

【参考方案2】:

另一种更人性化,也许更简单的“阅读”非非的方式:

第一个“!”做两件事:将值“转换”为布尔值,然后输出相反的值。因此,如果该值为“假”值,它将返回 true。

第二个“!”只是输出第一个的反面。

所以,基本上,输入值可以是任何东西,也许是一个字符串,但你想要一个布尔输出,所以使用第一个'!'。此时,如果在输入值为 'falsy' 时想要 TRUE,则到此为止,只需使用单个 '!';否则,如果输入值为 'truthy' 时想要 TRUE,则添加另一个 '!'。

【讨论】:

【参考方案3】:

这不是“双重非运算符”,而是两次应用的 not 运算符。右边的! 将产生一个布尔值,不管操作数是什么。然后左边的! 将否定该布尔值。

这意味着对于任何真值(非零的数字、非空字符串和数组等),您将获得布尔值TRUE,对于任何假值(0、0.0、NULL、空字符串或空数组)你会得到布尔值FALSE

它在功能上等同于对boolean 的强制转换:

return (bool)$row;

【讨论】:

"double-not-operator" 或 "double not-operator" .. 取决于你如何阅读它。 @nickf 不是真的,“双非运算符”是指一个运算符,而不是两次使用非运算符的行为。 @Theo,实际上是一个操作员?在这种情况下,解释器是否认为!! 等于(bool)?还是会根据使用的机器代码运行不同的机器代码? 这也适用于 javascript,这是Falsy Values For Javascript 的列表和 Falsy Values For PHP 的列表 您可以根据需要使用任意数量。如果有奇数个“刘海”(感叹号),则与!value 相同,如果有偶数个刘海,则与(bool) value 相同。【参考方案4】:

表示如果$row有truthy值,则返回true,否则返回false,转换为布尔值。

这是从 php 文档到布尔转换的示例表达式。

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

【讨论】:

【参考方案5】:

“not not”在许多语言中是一种方便的方式,用于理解语言赋予任何表达式结果的真值。例如在Python:

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

在您想将复杂值简化为“是否存在值?”之类的地方时,它会很方便。

【讨论】:

【参考方案6】:

与转换为 bool 相同(或几乎相同 - 可能存在一些极端情况)。如果$row 将强制转换为真,那么!! $row 也为真。

但如果你想达到(bool) $row,你应该只使用那个 - 而不是一些“有趣”的表达;)

【讨论】:

感谢这实际上是有道理的,我从未在其他编程语言中看到过这样的事情。 使用 !! 是 C(++) 编程遗留下来的习惯。在 C 中进行强制转换不像在 PHP 中那样容易,您可能会遇到许多不同的问题,编译警告,a.s.o。因此,人们使用!! 来投保铃。 @nikic - 听起来很奇怪,IMO...因为operator! 是可重载的,在C++ 中使用它会很危险。此外,您不能在 C 中转换结构,或将! 与它们一起使用。此外,如果某些东西可以被否定,你很可能能够从一个返回 int 的函数中返回它,这几乎使它成为一个布尔值。你确定你在谈论 C 吗? 我见过!!在许多 C 程序中作为 1/0 的安全转换。 (因为布尔值在 C 中实际上只不过是 0/“非零”。) @Pacerier 因此引用。它“有趣”,如 - 与演员表做同样的事情,但使用可能令人困惑的语法。

以上是关于PHP中的双非(!!)运算符的主要内容,如果未能解决你的问题,请参考以下文章

何时在 JavaScript 中使用双非 (!!) 运算符

什么是 ?? Dart 中的双问号?

比较 C++ 中的双精度,同行评审

“……”令牌是啥意思?即参数包上的双省略号运算符

c语言的双冒号是啥意思::

Python的双下划方法