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中的双非(!!)运算符的主要内容,如果未能解决你的问题,请参考以下文章