【踩坑】PHP中关于运算符优先级使用中可能遇到的问题
2017-06-26 14:49
405 查看
先上一段代码
预测一下,这段代码的输出内容?
不知道你有没有猜对,这段代码的实际输出结果是
前段时间偶然的一次错误发现了这个奇怪的问题,想了半天没想明白,一开始以为是if的问题,后来查了半天,最终确定是运算符优先级的问题。
因为&&运算符优先级高于=,所以if里的代码实际执行效果是
所以最终$a被赋值成true,$b被赋值成2。(但是这里还有一个疑问,这里优先级最高的&&却让位给了低于其优先级的$b=2,关于这个问题恰巧在鸟哥的博客看到了类似的问题及其讨论,受益匪浅
点击打开链接)
最终是因为自己基本功不够扎实啊,赶紧恶补了一下相关知识。
关于运算符优先级的官方手册说明:http://php.net/manual/zh/language.operators.precedence.php
其实官方手册下边的评论也值得一看,有一些朋友也给出了一些需要注意的关于运算符优先级的可能遇到的问题。
例如
因为&&运算符优先级高于=,但是and运算符低于=,所以在使用不当的时候可能会产生与预期不符的执行效果,平时写代码时需要额外留意。
最后留下一个思考题,看看下边的代码会输出什么内容?
$a=10; $b=20; if ($a = 1 && $b = 2) { echo '分支1'; } else { echo '分支2'; } var_dump($a); var_dump($b);
预测一下,这段代码的输出内容?
不知道你有没有猜对,这段代码的实际输出结果是
分支1bool(true) int(2)
前段时间偶然的一次错误发现了这个奇怪的问题,想了半天没想明白,一开始以为是if的问题,后来查了半天,最终确定是运算符优先级的问题。
因为&&运算符优先级高于=,所以if里的代码实际执行效果是
$a = (1 && ($b = 2))
所以最终$a被赋值成true,$b被赋值成2。(但是这里还有一个疑问,这里优先级最高的&&却让位给了低于其优先级的$b=2,关于这个问题恰巧在鸟哥的博客看到了类似的问题及其讨论,受益匪浅
点击打开链接)
最终是因为自己基本功不够扎实啊,赶紧恶补了一下相关知识。
关于运算符优先级的官方手册说明:http://php.net/manual/zh/language.operators.precedence.php
其实官方手册下边的评论也值得一看,有一些朋友也给出了一些需要注意的关于运算符优先级的可能遇到的问题。
例如
$bool = true && false; var_dump($bool); // false, that's expected $bool = true and false; var_dump($bool); // true, ouch!
因为&&运算符优先级高于=,但是and运算符低于=,所以在使用不当的时候可能会产生与预期不符的执行效果,平时写代码时需要额外留意。
最后留下一个思考题,看看下边的代码会输出什么内容?
$a=10; $b=20; $c=30; if ($a = 1 && $b = 2 && $c = 3) { echo '分支1'; } else { echo '分支2'; } var_dump($a); var_dump($b); var_dump($c);
相关文章推荐
- php关于使用iconv(...)函数对字符进行中文转换时,遇到的一个问题
- 关于Entity Framework更新的几种方式以及可能遇到的问题(附加类型“Model”的实体失败,因为相同类型的其他实体已具有相同的主键值)在使用 "Attach" 方法或者将实体的状态设置为 "Unchanged" 或 "Modified" 时如果图形中的任何实体具有冲突键值,则可能会发生上述行为
- C#关于使用枚举遇到的问题----Type运算符使用的必要性
- 关于php运算符优先级问题(php不完全遵守运算符优先级)
- php在foreach中使用引用赋值&可能遇到的问题
- 关于WinCE下MC55使用Unimodem进行GPRS拨号,拨上出现断开连接,检查波特率的问题的另一种可能情况
- 关于ibatis使用中遇到的问题 和解决方案
- 关于在UTF-8编码下使用ASPUPLOAD组件时遇到的问题
- 转帖:使用 Microsoft Visual Studio 2005 时可能遇到的问题
- 在IIS 发布Web App时使用ArcGIS Server Local services可能遇到的问题
- 关于流复制中可能遇到的问题及解决方案(一)捕获阶段。
- 安装PHP可能遇到的问题“无法载入mysql扩展” 的解决方法
- 最新的PHP java bridge使用方法和遇到的问题
- Nagios遇到的一点问题--关于如何使用timeperiod
- php使用 MsSql server时遇到的中文编码问题
- 转帖:使用BDC连接MySql可能遇到的问题
- 关于在neoshine linux下使用电视卡遇到的问题和总结
- 关于用c生成的dll在使用其他供应商的工具创建可执行模块时遇到的一些问题
- 刚才遇到了关于C#使用外部DLL函数上的char*的问题。
- 使用BDC连接MySql可能遇到的问题