关于php运算符优先级的几道题

今天正好群里有人在问一道php运算符优先级的问题,正好以前也遇到过类似的问题,这里整理一下吧,方便大家理解 以防掉坑:)

先来道简单的:

$a = 3; if ($a = 5) { $a++; } var_dump($a);// (int)6

这里掉坑的同学会认为是3. 注意=号是赋值 == 比较运算符 所以一个好的编码习惯 对于数字来说 最好把它放前面写成 5 == $a 这样即使你写成了 5 = $a 此时会报错 不会是隐式的赋值 来,我们接着看下一个坑. $x = 2; echo $x == 2 ? '我' : $x == 1 ? '你' : '它'; //你 掉坑里的同学可能认为结果是我, 因为$x确实等于2 根据三元运算符的规则 ?前为true就输出我了. 这里的知识点在于运算符优先级以及三元运算符左结合的特性,其实真正的执行流程是这样的: $x = 2;//将2赋值给变量x 没啥说的 echo $x == 2 ? '我' : $x == 1 ? '你' : '它'; //你 //因为 == 的优先级比三元运算符高 所以转换成如下代码 #echo true ? '我' : false ? '你' : '它'; //由于三元运算符左结合的特性 所以如上代码等效于 #echo (true ? '我' : false) ? '你' : '它'; //先计算左边括号里的 #echo '我' ? '你' : '它'; //到这里大家应该明白了吧 嗯,继续围观坑 $a = 3; $b = 5; if ($a = 3 || $b = 7) { $a++; $b++; } var_dump($a);//(bool)true var_dump($b);//(int)6 这题相信不少同学在做面试题的时候应该会遇到过,我第一次做的时候也被坑了。 被坑的同学相信答案大概有这么几种(4,6),(2,6) $b基本没啥争议,关键是$a到底是神马情况,来我们来讲解一下这个坑。 #赋值 没啥说的 $a = 3; $b = 5; if ($a = 3 || $b = 7) { $a++; $b++; } //知识点1: ||的优先级比=高 //所以$a = 3 || $b = 7 等效于 $a = (3 || $b = 7) //因为3 || $b = 7整个表达式为真 所以返回true 赋值给$a 此时$a = true, 将执行括号里的内容 //知识点2: 递增/递减运算符不影响布尔值。递减 NULL 值也没有效果,但是递增 NULL 的结果是1 //也就意味着$a依然是true,不会是1++之后的2 $b依然++ //所以结果是$a是true,$b是自增之后的6 更多大坑,等待收集..也欢迎大家提供~~

原文发布于微信公众号 - php(phpdaily)

原文发表时间:2016-03-24

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏后端技术探索

Base64编码原理,快速掌握

Base64编码,是我们程序开发中经常使用到的编码方法。它是一种基于用64个可打印字符来表示二进制数据的表示方法。它通常用作存储、传输一些二进制数据编码方法!也...

410
来自专栏代码世界

Python之面向对象三

面向对象的三大特性: 多态 多态指的是一类事物有多种形态。Python3天生支持多态。 动物有多种形态:人,狗,猪 import abc class Anima...

32510
来自专栏架构之路

Java关键字 Finally执行与break, continue, return等关键字的关系

长文短总结: 在程序没有在执行到finally之前异常退出的情况下,finally是一定执行的,即在finally之前的return语句将在finally执行...

5056
来自专栏Golang语言社区

Go语言的指针 & *

Go语言保留着C中值和指针的区别,但是对于指针繁琐用法进行了大量的简化,引入引用的概念。所以在Go语言中,你几乎不用担心会因为直接操作内寸而引起各式各样的错误。...

2725
来自专栏大内老A

关于CLR内存管理一些深层次的讨论[下篇]

《上篇》中我们主要讨论的是程序集(Assembly)和应用程序域(AppDomain)的话题,着重介绍了两个不同的程序集加载方式——独占方式和共享方式(中立域方...

1929
来自专栏阮一峰的网络日志

async 函数的含义和用法

本文是《深入掌握 ECMAScript 6 异步编程》系列文章的最后一篇。 Generator函数的含义与用法 Thunk函数的含义与用法 co函数库的含义...

2666
来自专栏芋道源码1024

【Netty 专栏】深入浅出 Netty 内存管理 PoolChunk

摘要: 原创出处 https://www.jianshu.com/p/c4bd37a3555b 「占小狼」欢迎转载,保留摘要,谢谢!

820
来自专栏十月梦想

JavaScript中类的创建以及类的传参

在之前(ES2015)以前我们常用构造函数来搞定一个事物类,通过new 这个构造函数实现类的功能!在ES6(ES2015)中已经可以使用类,下面我们看一下类如何...

732
来自专栏逆向技术

16位汇编第第四讲常用的7种寻址方式

常用的7中寻址方式 昨天稍微讲了一下,立即数寻址,今天继续讲解寻址方式. (注意,这个属于简陋版的,写了4个小时的博客,也就是第一版,保存了一下,但是博客出问题...

1835
来自专栏前端新视界

立即执行函数表达式(IIFE)

原文:immediately-invoked-function-expression 译者:nzbin 也许你还没有注意到,我是一个对术语比较坚持的人。因此...

1845

扫码关注云+社区