V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
OMGZui
V2EX  ›  PHP

PHP 一道让人郁闷的题目

  •  1
     
  •   OMGZui · 2017-11-21 09:32:42 +08:00 · 5500 次点击
    这是一个创建于 2593 天前的主题,其中的信息可能已经有所发展或是发生改变。
    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 条回复    2017-11-22 13:50:06 +08:00
    loadinger
        1
    loadinger  
       2017-11-21 09:36:43 +08:00
    你把最后的两个相加的数字上面加个括号试试.
    OMGZui
        2
    OMGZui  
    OP
       2017-11-21 09:39:09 +08:00
    @loadinger 加了括号就是优先运算括号内的,得出的是 1+5=6
    Sanko
        3
    Sanko  
       2017-11-21 09:41:05 +08:00 via Android
    好神奇
    zjsxwc
        4
    zjsxwc  
       2017-11-21 09:43:04 +08:00
    可以用隐式类型转换理解

    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  
       2017-11-21 09:43:38 +08:00   ❤️ 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  
       2017-11-21 09:44:58 +08:00 via iPhone   ❤️ 2
    和 c+++++c 一样无聊
    .优先计算了,结果字符串
    遇到+,尝试转数字类型,转的过程中遇到非数字停止,所以只剩第一个数字+最后一个数字
    Smilecc
        7
    Smilecc  
       2017-11-21 09:47:06 +08:00
    `echo "5+1=". 1+5;`被解析为`echo ("5+1=". 1)+5;`
    前面是个字符串拼接,也就是 `"5+1=1" + 5`,最终`5+1=1`这个字符串,转换成数字,第一个是数字 5,然后+号不是数字,于是被认为是数字 5,加上最后的一个 5,结果是 10。

    一点也不郁闷,只能说这代码从语法上就不对。
    kiwi95
        8
    kiwi95  
       2017-11-21 09:47:09 +08:00 via Android
    报错不是很明显了?用这个报错去 Google 搜不到答案?
    OMGZui
        9
    OMGZui  
    OP
       2017-11-21 09:51:33 +08:00
    @boyxupers 理解了,感谢
    OMGZui
        10
    OMGZui  
    OP
       2017-11-21 09:52:37 +08:00
    @R18 感谢,还提供了手册链接
    OMGZui
        11
    OMGZui  
    OP
       2017-11-21 09:59:04 +08:00
    @Smilecc 确实语法就不对,无意中看到了觉得很奇怪,google 了很久也没找到解释 0_0
    xiaoqi
        12
    xiaoqi  
       2017-11-21 10:00:09 +08:00
    这好像没啥郁闷的,主要是字符串拼接后的整形转换...
    realpg
        13
    realpg  
       2017-11-21 10:37:35 +08:00
    出这种题的要是线下 我都会直接拿水杯扔人
    jason19659
        14
    jason19659  
       2017-11-21 10:46:20 +08:00
    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  
       2017-11-21 11:40:22 +08:00
    @realpg #13 为什么,这个考的不就是 PHP 的运算符等级与 字符串的强制转换.(ps.我出过这题)
    realpg
        16
    realpg  
       2017-11-21 11:44:51 +08:00   ❤️ 1
    @R18 #15
    为啥要考这种我这个 12 年 PHPer 都遇不到的问题?

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

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

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

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

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

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

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

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

    我倒是觉得你可能需要去看看自己有没有得狂犬病, 怎么跟个野狗一样见人就咬?
    slgz
        38
    slgz  
       2017-11-22 12:01:20 +08:00
    作为一个两年的 phper,没看到回复,还真不知道答案,是不是很失败
    chnyang
        39
    chnyang  
       2017-11-22 13:50:06 +08:00
    @slgz ...2 年经验面试应该不会问这种,所以还好
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   965 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 32ms · UTC 22:32 · PVG 06:32 · LAX 14:32 · JFK 17:32
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.