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 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
|
6
boyxupers 2017-11-21 09:44:58 +08:00 via iPhone 2
和 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 2017-11-21 10:37:35 +08:00
出这种题的要是线下 我都会直接拿水杯扔人
|
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 2017-11-21 11:44:51 +08:00 1
@R18 #15
为啥要考这种我这个 12 年 PHPer 都遇不到的问题? 这题的核心是 PHP 官方手册都没写明白的字符串运算符与算术运算符的优先级问题,第二个知识点是强制转换 第三个是隐式 intval 的处理方式 如果单纯考后两个知识点,很正常,我也不会说啥,毕竟总用得到 第一个,PHP 手册都没写明白(官方把这两个放在一个里面,但是没写这两个一起遇到的优先级。 下面的第一个高亮 user note 就说这个问题),想了解就靠实际操作 对于一个稍微合格一点的 PHP 程序员,对于这种自己的刚性掌握准确度不是 100%的东西,都不是直接写,而是查手册,这种情况手册本身没写,就是写测试看看实际执行推测,并发帖验证 |
17
realpg 2017-11-21 11:45:50 +08:00 1
另外 就算这种方式知识了解,实际用的正确,敢写这样代码的早已经被正经公司开除了
|
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 1
来,你会不会回字的四种写法?
囘 囬 廻 迴 |
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 1
这几道题不算什么,我来出一道
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,没看到回复,还真不知道答案,是不是很失败
|