OMGZui
V2EX  ›  PHP

PHP 一道让人郁闷的题目

  •  1
     
  •   OMGZui · Nov 21, 2017 · 6137 views
    This topic created in 3111 days ago, the information mentioned may be changed or developed.
    echo "1+5=". 5+1; // 2
    echo "1+5=". 1+5; // 6
    echo "5+1=". 5+1; // 6
    echo "5+1=". 1+5; // 10
    

    只知道结果是第一个数和最后一个数相加得来的,运行时报错 A non well formed numeric value encountered

    个人猜测是运算符优先级问题和 PHP 弱类型? google 了半天也没找到解释,有大神指点吗?

    39 replies    2017-11-22 13:50:06 +08:00
    loadinger
        1
    loadinger  
       Nov 21, 2017
    你把最后的两个相加的数字上面加个括号试试.
    OMGZui
        2
    OMGZui  
    OP
       Nov 21, 2017
    @loadinger 加了括号就是优先运算括号内的,得出的是 1+5=6
    Sanko
        3
    Sanko  
       Nov 21, 2017 via Android
    好神奇
    zjsxwc
        4
    zjsxwc  
       Nov 21, 2017
    可以用隐式类型转换理解

    echo intval("1+5=". 5)+1; // 2
    echo intval("1+5=". 1)+5; // 6
    echo intval("5+1=". 5)+1; // 6
    echo intval("5+1=". 1)+5; // 10

    intval 会把字符串第一个开始最长数字字符转换为数字
    R18
        5
    R18  
       Nov 21, 2017   ❤️ 2
    他的运算时这样的 "1+5=" . 5 = "1+5=5"; "1+5=5"+1 = 2; http://php.net/manual/zh/language.types.string.php#language.types.string.conversion
    boyxupers
        6
    boyxupers  
       Nov 21, 2017 via iPhone   ❤️ 2
    和 c+++++c 一样无聊
    .优先计算了,结果字符串
    遇到+,尝试转数字类型,转的过程中遇到非数字停止,所以只剩第一个数字+最后一个数字
    Smilecc
        7
    Smilecc  
       Nov 21, 2017
    `echo "5+1=". 1+5;`被解析为`echo ("5+1=". 1)+5;`
    前面是个字符串拼接,也就是 `"5+1=1" + 5`,最终`5+1=1`这个字符串,转换成数字,第一个是数字 5,然后+号不是数字,于是被认为是数字 5,加上最后的一个 5,结果是 10。

    一点也不郁闷,只能说这代码从语法上就不对。
    kiwi95
        8
    kiwi95  
       Nov 21, 2017 via Android
    报错不是很明显了?用这个报错去 Google 搜不到答案?
    OMGZui
        9
    OMGZui  
    OP
       Nov 21, 2017
    @boyxupers 理解了,感谢
    OMGZui
        10
    OMGZui  
    OP
       Nov 21, 2017
    @R18 感谢,还提供了手册链接
    OMGZui
        11
    OMGZui  
    OP
       Nov 21, 2017
    @Smilecc 确实语法就不对,无意中看到了觉得很奇怪,google 了很久也没找到解释 0_0
    xiaoqi
        12
    xiaoqi  
       Nov 21, 2017
    这好像没啥郁闷的,主要是字符串拼接后的整形转换...
    realpg
        13
    realpg  
    PRO
       Nov 21, 2017
    出这种题的要是线下 我都会直接拿水杯扔人
    jason19659
        14
    jason19659  
       Nov 21, 2017
    echo "1+ [5=". 5+] 1; // 2
    echo "1+ [5=". 1+] 5; // 6
    echo "5+ [1=". 5+] 1; // 6
    echo "5+ [1=". 1+] 5; // 10
    括号内删掉? 神奇的语言。。。 ~~.~~
    R18
        15
    R18  
       Nov 21, 2017
    @realpg #13 为什么,这个考的不就是 PHP 的运算符等级与 字符串的强制转换.(ps.我出过这题)
    realpg
        16
    realpg  
    PRO
       Nov 21, 2017   ❤️ 1
    @R18 #15
    为啥要考这种我这个 12 年 PHPer 都遇不到的问题?

    这题的核心是 PHP 官方手册都没写明白的字符串运算符与算术运算符的优先级问题,第二个知识点是强制转换 第三个是隐式 intval 的处理方式

    如果单纯考后两个知识点,很正常,我也不会说啥,毕竟总用得到

    第一个,PHP 手册都没写明白(官方把这两个放在一个里面,但是没写这两个一起遇到的优先级。 下面的第一个高亮 user note 就说这个问题),想了解就靠实际操作

    对于一个稍微合格一点的 PHP 程序员,对于这种自己的刚性掌握准确度不是 100%的东西,都不是直接写,而是查手册,这种情况手册本身没写,就是写测试看看实际执行推测,并发帖验证
    realpg
        17
    realpg  
    PRO
       Nov 21, 2017   ❤️ 1
    另外 就算这种方式知识了解,实际用的正确,敢写这样代码的早已经被正经公司开除了
    R18
        18
    R18  
       Nov 21, 2017
    @realpg #17 了解了
    andrewDDC
        19
    andrewDDC  
       Nov 21, 2017
    好无聊
    gdtv
        20
    gdtv  
       Nov 21, 2017
    加几个括号就能解决的问题,为什么要这么折腾人?
    iccfish
        21
    iccfish  
       Nov 21, 2017
    PHP 真是一门神奇的语言啊哈哈哈哈哈哈哈哈哈
    checgg
        22
    checgg  
       Nov 21, 2017
    又来黑 PHP。。。。
    lsls931011
        23
    lsls931011  
       Nov 21, 2017
    @Smilecc 正解,这个在 PHP 手册上有写过
    dangyuluo
        24
    dangyuluo  
       Nov 21, 2017   ❤️ 1
    来,你会不会回字的四种写法?
    囘 囬 廻 迴
    GGGG430
        25
    GGGG430  
       Nov 21, 2017 via Android
    不就是个隐式转换
    fengyqf
        26
    fengyqf  
       Nov 21, 2017
    咱能多看看手册吧,至少语言参考一章,一字不落的看三遍。
    所有编程语言的手册,中文最全面的恐怕就是 PHP 了(没有之一).

    不得不说,php 里+-.三个运算符同优先级,还有隐式数字转换,都是坑
    laoyuan
        28
    laoyuan  
       Nov 21, 2017   ❤️ 1
    这几道题不算什么,我来出一道

    echo '9,999' + 1;
    yongjing
        29
    yongjing  
       Nov 21, 2017
    @laoyuan 道理跟上面一样
    laoyuan
        30
    laoyuan  
       Nov 21, 2017
    LS 你来告诉我答案啊
    msg7086
        31
    msg7086  
       Nov 21, 2017
    还有这种题:
    $a = '9d9';
    $a++;
    $a--;
    echo $a;
    yangbin9317
        32
    yangbin9317  
       Nov 21, 2017
    很简单啊

    "1+5=". 5 是 "1+5=5"

    "1+5=5" + 1 "1+5=5" 被转为 1 也就是 1 + 1 也就是 2
    bramblex
        33
    bramblex  
       Nov 21, 2017
    胡乱转了类型还不跟你说一声, 所以我们才称 php 为世界上最好的语言
    kookxiang
        34
    kookxiang  
       Nov 21, 2017 via iPhone
    谭语言?
    jhdxr
        35
    jhdxr  
       Nov 21, 2017
    @bramblex 你没看到帖子里写了『 A non well formed numeric value encountered 』,瞎了的话尽早去看眼科
    sagaxu
        36
    sagaxu  
       Nov 22, 2017 via Android
    php 也需要来一本 the good part 了,中文名 php 精粹,然后写完发现只有 20 页
    bramblex
        37
    bramblex  
       Nov 22, 2017
    @jhdxr

    我倒是觉得你可能需要去看看自己有没有得狂犬病, 怎么跟个野狗一样见人就咬?
    slgz
        38
    slgz  
       Nov 22, 2017
    作为一个两年的 phper,没看到回复,还真不知道答案,是不是很失败
    chnyang
        39
    chnyang  
       Nov 22, 2017
    @slgz ...2 年经验面试应该不会问这种,所以还好
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   2428 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 95ms · UTC 15:55 · PVG 23:55 · LAX 08:55 · JFK 11:55
    ♥ Do have faith in what you're doing.