我有这段代码:
$a = 1;
$a = !$a - $a;
echo $a;
我在考虑!0
- 开玩笑,但输出为-1
。不幸的是我无法理解为什么结果是-1
。如果有人解释的话会很棒。
答案 0 :(得分:10)
如果您执行var_dump(!$a);
,则会看到!$a
不再是整数。这是一个boolean false
,并不是因为它的原始值是1
。看看这个:
$a = 5;
$a = !$a - $a;
echo $a; // output: -5
您可能也有兴趣执行以下操作:
$a = 5;
$a = false - $a;
echo $a; // output: -5
因此,正如您所看到的,!$a
表示false
,它会转换为0
。所以,根据你的例子,我们有类似的东西:
$a = 1;
$a = !$a - $a;
相当于:
$a = 0 - 1;
哪个是-1
。
此外,true
也转换为1
。你想确定吗?尝试一下:
$a = 5;
$a = true - $a;
echo $a; // output: -4
我想现在应该清楚了!如果它仍然令人困惑,请告诉我。
答案 1 :(得分:3)
这是因为一元NOT在减法之前被评估,即它的评估如下:
$a = (!$a) - $a;
此处!$a
=>由于减法,false
也被投放到0
。
为了得到你所期望的,你应该加上括号:
$a = !($a - $a);
另请参阅:operator precedence
答案 2 :(得分:1)
好$a
是1
因此NOT $a
!$a
为假(转换为0)
0 - 1 = -1
运算符!
是逻辑非运算符