PHP 一道让人郁闷的题目 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
OMGZui
V2EX    PHP

PHP 一道让人郁闷的题目

  •  1
     
  •   OMGZui 2017-11-21 09:32:42 +08:00 5818 次点击
    这是一个创建于 2891 天前的主题,其中的信息可能已经有所发展或是发生改变。
    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  
    PRO
       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  
    PRO
       2017-11-21 11:44:51 +08:00   1
    @R18 #15
    为啥要考这种我这个 12 年 PHPer 都遇不到的问题?

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

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

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

    对于一个稍微合格一点的 PHP 程序员,对于这种自己的刚性掌握准确度不是 100%的东西,都不是直接写,而是查手册,这种情况手册本身没写,就是写测试看看实际执行推测,并发帖验证
    realpg
        17
    realpg  
    PRO
       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     Solana     3759 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 31ms UTC 00:50 PVG 08:50 LAX 17:50 JFK 20:50
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86