前言之前我在面试的时候,遇到许多年轻人都声称自己精通php,有过许多项目经验等等。然而,当真正笔试的时候,我问到 中, 引申对于算法的一些问题,我个人一向是非常较真的,我招人的时候也是非常侧重此方面,因此我对php的关注也是在这方面多些。故事得从一个知乎上的问题开始。 这个问题非常的有意思,也是一个大坑,许多人都算错了,包括很多我认识的大牛。在这里就不点名字,以免其羞愧。 然而你以为我一开始算对了吗?我算对了第一题,第二题却是百思不得其解。最后用调试工具一番调试才算理清头绪。索性发出来与大家一起分享这个有意思的问题。 分析第一题php语言解释这个其实非常简单, 哈,很多人肯定以为是等于5,然而这个是操作的同一个变量,等同于改变了两次 正常情况然而在php中,为了照顾人类的逻辑, 默认情况下,即使名字相同的基本类型的变量,也不会使用同一个变量地址 ,因此,以上代码会被解析为 但是由于 的存在,使得下面的第一个 然而实际上,这个结果反而是正确的。PHP中的 深入思考为什么说等于6才是正确结果呢?我们知道现行高级语言大多来自c语言,php也不例外,我们这里用c语言来写一遍上述代码,然后通过
其实无论是否注释下面的取地址,结果都是6。 我们看汇编代码
这里更清晰的看到 问题二问题发现由问题一的结论来分析问题二,反而陷入了一个更大的舞曲,为什么呢? 然而输出的结果却是10. 动手实验这里我们用一个工具
可以看到的a的值的变化: 1->2->3->4 然后我们再来调试一下注释掉 的结果。
这里在第二步的时候重新给了 实验结果但是为什么上面的结果为10呢? 这其实是因为 这个取地址运算只起效了一句运算指令,就是只管事了第一回合,对于以后的运算,php还是用了平常的算法。 即: 结论我认为出现这种诡异的结果应该算是php的bug,同时,这也说明了此种问题不太容易被发现和暴露,这要求我们平常写代码的时候尽量使用常用的语法,和精干的语句,让代码和逻辑达到最佳的平衡点。 此BUG我已经反馈到php官方。 后续最新的php7中已经修复了此bug。 修订记录
|
|
声明:文章版权归原作者所有 部分文章转自互联网 如有侵权请联系
[邮箱地址] 删除
|