PHP 一道让人郁闷的题目

2017-11-21 09:32:42 +08:00
 OMGZui
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 了半天也没找到解释,有大神指点吗?

5495 次点击
所在节点    PHP
39 条回复
loadinger
2017-11-21 09:36:43 +08:00
你把最后的两个相加的数字上面加个括号试试.
OMGZui
2017-11-21 09:39:09 +08:00
@loadinger 加了括号就是优先运算括号内的,得出的是 1+5=6
Sanko
2017-11-21 09:41:05 +08:00
好神奇
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
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
boyxupers
2017-11-21 09:44:58 +08:00
和 c+++++c 一样无聊
.优先计算了,结果字符串
遇到+,尝试转数字类型,转的过程中遇到非数字停止,所以只剩第一个数字+最后一个数字
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
2017-11-21 09:47:09 +08:00
报错不是很明显了?用这个报错去 Google 搜不到答案?
OMGZui
2017-11-21 09:51:33 +08:00
@boyxupers 理解了,感谢
OMGZui
2017-11-21 09:52:37 +08:00
@R18 感谢,还提供了手册链接
OMGZui
2017-11-21 09:59:04 +08:00
@Smilecc 确实语法就不对,无意中看到了觉得很奇怪,google 了很久也没找到解释 0_0
xiaoqi
2017-11-21 10:00:09 +08:00
这好像没啥郁闷的,主要是字符串拼接后的整形转换...
realpg
2017-11-21 10:37:35 +08:00
出这种题的要是线下 我都会直接拿水杯扔人
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
2017-11-21 11:40:22 +08:00
@realpg #13 为什么,这个考的不就是 PHP 的运算符等级与 字符串的强制转换.(ps.我出过这题)
realpg
2017-11-21 11:44:51 +08:00
@R18 #15
为啥要考这种我这个 12 年 PHPer 都遇不到的问题?

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

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

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

对于一个稍微合格一点的 PHP 程序员,对于这种自己的刚性掌握准确度不是 100%的东西,都不是直接写,而是查手册,这种情况手册本身没写,就是写测试看看实际执行推测,并发帖验证
realpg
2017-11-21 11:45:50 +08:00
另外 就算这种方式知识了解,实际用的正确,敢写这样代码的早已经被正经公司开除了
R18
2017-11-21 11:51:31 +08:00
@realpg #17 了解了
andrewDDC
2017-11-21 13:05:39 +08:00
好无聊
gdtv
2017-11-21 13:13:21 +08:00
加几个括号就能解决的问题,为什么要这么折腾人?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/408129

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX