关于 PHP 的一个**运算问题

2020-09-28 09:53:22 +08:00
 absolutelynull
<?php

$n = -2;

echo $n ** 2;  // $n = -2; -2 ** 2 = 4

echo '|';

echo -2 ** 2; //           -2 ** 2 = 4

//结果为: 4|-4

// 正常来说的话 -2 ** 2 = -4 的吧

为啥把-2 赋值给一个变量之后 就是 $n**2=4,其实$n=-2

1563 次点击
所在节点    问与答
16 条回复
xiri
2020-09-28 10:01:06 +08:00
乘方的优先级比减号高,你的第二个实际相当于 0-(2**2)
而第一个的话实际上是先计算了$n=0-2,再去乘方,相当于(-2)**2
xiri
2020-09-28 10:04:59 +08:00
@xiri 突然发现你说“ 正常来说的话 -2 ** 2 = -4 的吧”,感觉有点迷惑啊。
负二的平方是等于四啊,二的平方再取负数是负四,说白了就是运算符优先级的问题,符号一般是处理成零减某某某的,优先级当减号看
iyaozhen
2020-09-28 10:11:19 +08:00
$n = (-2)
(-2)^2 = 4

你说的是这样 eval("$n ** 2") = eval("-2 ** 2") = eval("-(2**2)")

这个又不是字符串拼接,不是拼好了再执行
lovecy
2020-09-28 11:18:44 +08:00
整了两年 PHP 了,第一次发现还有这运算符,最奇葩的是优先级居然是第二高的,仅次于 clone/new,真的迷惑。。。。。。。。。。。
sparrww
2020-09-28 11:26:58 +08:00
你平时用的到吗,不讨论骚操作
cccp2020
2020-09-28 11:29:09 +08:00
负数的平方本来就是正数吧 ** 自乘也是求平方的

-2 ** 2 应该是运算符优先级导致的, - ( 2 ** 2 )
JJstyle
2020-09-28 12:32:03 +08:00
虽然反常,但是合理,可以这样:

php > echo (-2) ** 2;
4
Chappako
2020-09-28 13:06:40 +08:00
用 bcpow() 吧
ruyu
2020-09-28 13:24:39 +08:00
其实 python -2 ** 2 也是 -4
iNaru
2020-09-28 13:28:18 +08:00
js 直接报错
chaogao2016
2020-09-28 13:58:36 +08:00
我搞了 4 年 php,也是第一次见这个运算符
absolutelynull
2020-09-28 14:05:19 +08:00
-.-!!!!
wanglilong
2020-09-28 16:20:58 +08:00
也只有面试题会有这种,实际开发过程中这样写怕是会被打吧
foundnot404
2020-09-28 16:27:15 +08:00
其实这东西跟编程语言没有任何关系,**就是乘方运算符,自己想一下数学中-2^2 是多少看看?
乘方的优先级是最高的,-2^2=-(2^2)=-4,(-2)^2=4,没有任何问题
lovecy
2020-09-29 11:47:36 +08:00
@iNaru JS 没有**这个运算符,可以直接用^,比如
> -2^2
< -4
lovecy
2020-09-29 11:50:00 +08:00
@foundnot404 是哦,仔细想想确实乘、除、乘方这些优先级都比正负号要高

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/711141

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX