博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
你可能不知道的PHP加减法
阅读量:6836 次
发布时间:2019-06-26

本文共 1426 字,大约阅读时间需要 4 分钟。

这可能算不上是一次正规的解说,毕竟有点烧脑。

起因

是这样的,我们都知道php语法里有自增操作,即 ++,那么下面我列出一个表达式

$a = 1;$result = $a  +  $a++; // $result === 3

好的,为什么等于3?只有一种解释,就是自增的优先级高于加减,所以二号位自增导致了一号位也变成2。(3 = 2 + 1)

既然一号位变成了2,为何二号位不会变成2呢?因为后置自增的返回值仅是临时变量,这点和 C/C++是一致的,毕竟PHP也是基于C实现的。


换个写法

$a = 1;$result = $a  +  ++$a; // $result === 4

似乎验证了刚才的解释。由于是前置自增,所以二号位自己的值也变成了2。(4 = 2 + 2)

恶化

接下来,我们把数量增加到3个

$a = 1;$result = $a  +  ++$a  +  ++$a;  // $result === 7

为什么是7?按照思路,应该是 9 = 3 + 3 + 3,也是醉了,并没有按照常理出牌。


增加到4个呢

$a = 1;$result = $a  +  ++$a  +  ++$a + ++$a;  // $result === 11

答案也不是 16 = 4 + 4 + 4 + 4,好吧,和我想的不一样。

猜测

既然2个$a相加可以正确推算,而3个开始就出错,为何?于是有了一个猜测,PHP是这样相加的

$a = 1;$result = ( ( $a  +  ++$a )   +  ++$a )  +  ++$a; // $result === 11

优先级顺序 () > ++ > +,11 = ( ( 2 + 2 ) + 3 ) + 4,每跳出一层,$a都自增了1。

有括号和没有括号的运算,最终运算结果都是11,我有点确信隐形括号这个事实。

隐形括号

于是我只让最后一个$a是自增的

$a = 1;$result_a = $a  +  $a   +  $a   +  ++$a;  // $result_a === 5$a = 1;$result_b = ( ( $a  +  $a)  +  $a )  +  ++$a;  // $result_b === 5

好的,$result_a 和 $result_b 的值是一样的。5 = ( ( 1 + 1 ) + 1 ) + 2


我们此时加入后置自增,看看结果会不会一样

$a = 1;$result_a = $a  +  $a   +  $a++   +  ++$a;  // $result_a === 6$a = 1;$result_b = ( ( $a  +  $a)  +  $a++ )  +  ++$a;  // $result_b === 6

是的,遵循了隐形括号的规则, 6 = ( ( 1 + 1) + 1 ) + 3。

诡异的1

为了给隐形括号做个最终的定论,我们再看一个烧脑例子

$a = 1;$result_a =       $a  +  ++$a  +  ++$a; // $result_a === 7$a = 1;$result_b = 1  +  $a  +  ++$a  +  ++$a; // $result_b === 7

不不不,你没有看错,$result_b的前面真的多了一个1。但是,它们的值都是7。你知道为什么吗?

转载地址:http://hcxkl.baihongyu.com/

你可能感兴趣的文章
静态文件过期缓存、Nginx防盗链、访问控制
查看>>
解决Spring扫描实体映射文件报错的问题
查看>>
ConcurrentModificationException
查看>>
webpack-dev-server启动后, localhost:8080返回index.html的原理
查看>>
cookie是什么?作用?生命周期?
查看>>
6月20日任务 mysql用户管理 、常用sql语句、mysql数据库备份恢复
查看>>
阿里工程师开发了一款免费工具,提升Kubernetes应用开发效率
查看>>
MySQL 24小时入门笔记(1),概念
查看>>
Data Lake Analytics IP白名单设置攻略
查看>>
使用无界队列的线程池会导致内存飙升吗?
查看>>
vue.js响应式原理解析与实现—实现v-model与{{}}指令
查看>>
详解深度学习之经典网络架构——LeNet
查看>>
推荐一款超级好用的AI模型训练平台——Tesra超算网络!
查看>>
hadoop任务map将其输入写入本地硬盘,而非hdfs,为什么
查看>>
linux上运行最简单的java程序
查看>>
深度辨析 Python 的 eval() 与 exec()
查看>>
20190601预习和课堂笔记
查看>>
通过自定义SparkSQL外部数据源实现SparkSQL读取HBase
查看>>
时间日期
查看>>
spring data jpa 入门
查看>>