PHP中的double not(!!)运算符


Answers:


290

这不是“ double not运算符”,它是两次应用的not运算符。无论操作数如何,该权利!都将导致布尔值。然后左边将否定该布尔值。!

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

它在功能上等同于强制转换为boolean

return (bool)$row;

22
“ double-not-operator”或“ double not-operator” ..取决于您的阅读方式。
尼克

9
@nickf不是,“ double not运算符”指的是一个运算符,而不是两次使用not运算符的行为。
Theo

3
@Theo,实际上是一个运算符?在这种情况下,口译员是否认为!!等于(bool)?还是会根据使用哪种机器码来运行不同的机器码?
Pacerier's

这也适用于JavaScript,这是JavascriptFalsy值的列表,这是PHP
Jomar Sevillejo 2015年

1
您可以根据需要使用任意数量。如果“刘海”(感叹号)的数量为奇数,则它将与NOT操作相同!value,如果刘海的偶数为奇数,则它将与相同(bool) value
diamondsea

51

与强制转换为bool相同(或几乎相同-可能会有一些极端情况)。如果$row将其转换为true,则!! $row也为true。

但是,如果您想实现(bool) $row,则可能应该只使用-而不是使用一些“有趣的”表达式;)


2
谢谢,实际上是有道理的,我从未在其他编程语言中见过这样的东西。
Andrei 2010年

16
使用!!是C(++)编程中剩下的一种习惯。在C语言中,进行强制转换并不像在PHP中那样容易,所以您会遇到许多不同的问题,还会编译警告,因此人们会使用来强制转换!!
NikiC

1
@nikic-IMO,这听起来很奇怪,因为它operator!是可重载的,使用它C++会很危险。同样,您不能在C中强制转换结构,也不能!与它们一起使用。同样,如果某些东西可以取反,那么您很可能能够从返回int的函数中返回它,这几乎使它成为布尔值。您确定要谈论C吗?
viraptor 2010年

2
我见过 !!在许多C程序中可以安全地转换为1/0。(因为布尔值实际上只不过是C中的0 /“非零”而已)
Falken教授

1
@viraptor,!!并不像您所说的那样“有趣”。从C到JavaScript到处都是。
Pacerier,2015年

18

这意味着如果$row具有真实值,则将返回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

7

在许多语言中,“ not not”是一种方便的方式,用于了解该语言为任何表达式的结果分配了什么真值。例如,在Python中

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

在您要将复杂的价值降低到“根本没有价值吗?”之类的地方,这可能会很方便。


1

另一种更人性化(也许更简单)的方式来“阅读”不是:

  • 首先 '!' 做两件事:将值“转换”为布尔值,然后输出相反的值。因此,如果该值是“虚假”值,它将为真。

  • 第二 '!' 只是输出与第一个相反的内容。

因此,基本上,输入值可以是任何值,可以是字符串,但是您需要布尔输出,因此请使用第一个“!”。此时,如果输入值为'falsy'时希望为TRUE,则在此处停止并仅使用一个'!';否则,如果在输入值“ truthy”时希望为TRUE,则添加另一个“!”。


0

让我们来看看

!$a;

而不是解释!运算符就像

右侧相反的布尔

表达式右边的布尔相反

在这种情况下

$a;

可能是一种表达

如此

!$a;

也是如此

!!$a;

!!!$a;

以此类推,因为每个都是有效表达式,所以!每个运算符都可以放在运算符之前。

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.