OMGZui
V2EX  ›  PHP

PHP 一道让人郁闷的题目

  •  1
     
  •   OMGZui · Nov 21, 2017 · 6532 views
    This topic created in 3279 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
    loadinger
    Nov 21, 2017
    1
    你把最后的两个相加的数字上面加个括号试试.
    OMGZui
    OMGZui
    OP
    Nov 21, 2017
    2
    @loadinger 加了括号就是优先运算括号内的,得出的是 1+5=6
    Sanko
    Sanko
    Nov 21, 2017 via Android
    3
    好神奇
    zjsxwc
    zjsxwc
    Nov 21, 2017
    4
    可以用隐式类型转换理解

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

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

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

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

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

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

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

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

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

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

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