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

And*_*rei 179 php operators

double not运算符在PHP中做什么?

例如:

return !! $row;
Run Code Online (Sandbox Code Playgroud)

上面的代码会做什么?

The*_*heo 278

这不是"双不操作",这是不是运营商应用的两倍.无论操作数如何,右边!都会产生一个布尔值.然后左边将否定该布尔值.!

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

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

return (bool)$row;
Run Code Online (Sandbox Code Playgroud)

  • "double-not-operator"或"double not-operator"...取决于你如何阅读它. (19认同)
  • @nickf不是真的,"double not operator"是指一个运算符,而不是两次使用not运算符的行为. (8认同)
  • @Theo,它实际上是一个运营商?在这种情况下,解释器是否认为`!!`等于`(bool)`?或者根据使用的机器代码运行不同的机器代码? (3认同)
  • 您可以根据需要使用任意数量。如果有奇数个 'bangs'(感叹号),它将是与 `!value` 相同的 NOT 操作,如果有偶数个 bangs,它将与 `(bool) value` 相同。 (2认同)

vir*_*tor 51

对于布尔来说,它是相同的(或几乎相同 - 可能有一些角落的情况).如果$row会转为真,那么!! $row也是如此.

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

  • 使用`!!`是C(++)中编程的习惯.在C中,执行转换并不像在PHP中那么容易,你可以得到许多不同的问题,编译警告,aso因此人们使用`!!`来转换为boll. (15认同)
  • @Pacerier 因此引用了。它很“有趣”,就像 - 做与强制转换相同的事情,但使用可能令人困惑的语法。 (3认同)
  • 感谢真的很有意义,我在其他编程语言中看到过这样的东西. (2认同)
  • 我见过 !!在许多C程序中作为安全转换为1/0.(因为布尔在C中实际上只是0 /"非零") (2认同)

YOU*_*YOU 17

这意味着如果$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
Run Code Online (Sandbox Code Playgroud)


Ste*_*ett 7

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

>>> not not []
False
>>> not not [False]
True
Run Code Online (Sandbox Code Playgroud)

在想要将复杂值降低到"有价值吗?"之类的地方,它可以很方便.