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 了半天也没找到解释,有大神指点吗?
![]() | 1 loadinger 2017-11-21 09:36:43 +08:00 你把最后的两个相加的数字上面加个括号试试. |
![]() | 3 Sanko 2017-11-21 09:41:05 +08:00 via Android 好神奇 |
![]() | 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 会把字符串第一个开始最长数字字符转换为数字 |
![]() | 5 R18 2017-11-21 09:43:38 +08:00 ![]() 他的运算时这样的 "1+5=" . 5 = "1+5=5"; "1+5=5"+1 = 2; http://php.net/manual/zh/language.types.string.php#language.types.string.conversion |
6 boyxupers 2017-11-21 09:44:58 +08:00 via iPhone ![]() 和 c+++++c 一样无聊 .优先计算了,结果字符串 遇到+,尝试转数字类型,转的过程中遇到非数字停止,所以只剩第一个数字+最后一个数字 |
![]() | 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。 一点也不郁闷,只能说这代码从语法上就不对。 |
![]() | 8 kiwi95 2017-11-21 09:47:09 +08:00 via Android 报错不是很明显了?用这个报错去 Google 搜不到答案? |
![]() | 12 xiaoqi 2017-11-21 10:00:09 +08:00 这好像没啥郁闷的,主要是字符串拼接后的整形转换... |
![]() | 13 realpg PRO 出这种题的要是线下 我都会直接拿水杯扔人 |
![]() | 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 括号内删掉? 神奇的语言。。。 ~~.~~ |
![]() | 16 realpg PRO ![]() @R18 #15 为啥要考这种我这个 12 年 PHPer 都遇不到的问题? 这题的核心是 PHP 官方手册都没写明白的字符串运算符与算术运算符的优先级问题,第二个知识点是强制转换 第三个是隐式 intval 的处理方式 如果单纯考后两个知识点,很正常,我也不会说啥,毕竟总用得到 第一个,PHP 手册都没写明白(官方把这两个放在一个里面,但是没写这两个一起遇到的优先级。 下面的第一个高亮 user note 就说这个问题),想了解就靠实际操作 对于一个稍微合格一点的 PHP 程序员,对于这种自己的刚性掌握准确度不是 100%的东西,都不是直接写,而是查手册,这种情况手册本身没写,就是写测试看看实际执行推测,并发帖验证 |
![]() | 17 realpg PRO ![]() 另外 就算这种方式知识了解,实际用的正确,敢写这样代码的早已经被正经公司开除了 |
![]() | 19 andrewDDC 2017-11-21 13:05:39 +08:00 好无聊 |
20 gdtv 2017-11-21 13:13:21 +08:00 加几个括号就能解决的问题,为什么要这么折腾人? |
21 iccfish 2017-11-21 13:32:04 +08:00 PHP 真是一门神奇的语言啊哈哈哈哈哈哈哈哈哈 |
![]() | 22 checgg 2017-11-21 13:47:46 +08:00 又来黑 PHP。。。。 |
23 lsls931011 2017-11-21 13:47:58 +08:00 @Smilecc 正解,这个在 PHP 手册上有写过 |
![]() | 24 dangyuluo 2017-11-21 13:50:11 +08:00 ![]() 来,你会不会回字的四种写法? |
25 GGGG430 2017-11-21 13:54:17 +08:00 via Android 不就是个隐式转换 |
26 fengyqf 2017-11-21 14:50:29 +08:00 咱能多看看手册吧,至少语言参考一章,一字不落的看三遍。 所有编程语言的手册,中文最全面的恐怕就是 PHP 了(没有之一). 不得不说,php 里+-.三个运算符同优先级,还有隐式数字转换,都是坑 |
![]() | 28 laoyuan 2017-11-21 15:07:14 +08:00 ![]() 这几道题不算什么,我来出一道 echo '9,999' + 1; |
![]() | 30 laoyuan 2017-11-21 16:22:21 +08:00 LS 你来告诉我答案啊 |
![]() | 31 msg7086 2017-11-21 19:20:30 +08:00 还有这种题: $a = '9d9'; $a++; $a--; echo $a; |
![]() | 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 |
33 bramblex 2017-11-21 19:25:04 +08:00 胡乱转了类型还不跟你说一声, 所以我们才称 php 为世界上最好的语言 |
![]() | 34 kookxiang 2017-11-21 20:39:37 +08:00 via iPhone 谭语言? |
35 jhdxr 2017-11-21 22:22:38 +08:00 @bramblex 你没看到帖子里写了『 A non well formed numeric value encountered 』,瞎了的话尽早去看眼科 |
![]() | 36 sagaxu 2017-11-22 09:03:36 +08:00 via Android php 也需要来一本 the good part 了,中文名 php 精粹,然后写完发现只有 20 页 |
![]() | 38 slgz 2017-11-22 12:01:20 +08:00 作为一个两年的 phper,没看到回复,还真不知道答案,是不是很失败 |