V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
absolutelynull
V2EX  ›  问与答

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

  •  
  •   absolutelynull · 2020-09-28 09:53:22 +08:00 · 1710 次点击
    这是一个创建于 1499 天前的主题,其中的信息可能已经有所发展或是发生改变。
    <?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

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

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

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

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

    php > echo (-2) ** 2;
    4
    Chappako
        8
    Chappako  
       2020-09-28 13:06:40 +08:00
    用 bcpow() 吧
    ruyu
        9
    ruyu  
       2020-09-28 13:24:39 +08:00
    其实 python -2 ** 2 也是 -4
    iNaru
        10
    iNaru  
       2020-09-28 13:28:18 +08:00
    js 直接报错
    chaogao2016
        11
    chaogao2016  
       2020-09-28 13:58:36 +08:00
    我搞了 4 年 php,也是第一次见这个运算符
    absolutelynull
        12
    absolutelynull  
    OP
       2020-09-28 14:05:19 +08:00
    -.-!!!!
    wanglilong
        13
    wanglilong  
       2020-09-28 16:20:58 +08:00
    也只有面试题会有这种,实际开发过程中这样写怕是会被打吧
    foundnot404
        14
    foundnot404  
       2020-09-28 16:27:15 +08:00   ❤️ 2
    其实这东西跟编程语言没有任何关系,**就是乘方运算符,自己想一下数学中-2^2 是多少看看?
    乘方的优先级是最高的,-2^2=-(2^2)=-4,(-2)^2=4,没有任何问题
    lovecy
        15
    lovecy  
       2020-09-29 11:47:36 +08:00
    @iNaru JS 没有**这个运算符,可以直接用^,比如
    > -2^2
    < -4
    lovecy
        16
    lovecy  
       2020-09-29 11:50:00 +08:00
    @foundnot404 是哦,仔细想想确实乘、除、乘方这些优先级都比正负号要高
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3065 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 13:40 · PVG 21:40 · LAX 05:40 · JFK 08:40
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.