资讯专栏INFORMATION COLUMN

你可能不知道的PHP加减法

JessYanCoding / 2894人阅读

摘要:起因是这样的,我们都知道语法里有自增操作,即,那么下面我列出一个表达式好的,为什么等于只有一种解释,就是自增的优先级高于加减,所以二号位自增导致了一号位也变成。但是,它们的值都是。

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

起因

是这样的,我们都知道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。你知道为什么吗?

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/28775.html

相关文章

  • PHP处理数学精度

    摘要:后来我看了下,确实有这么一个扩展库,处理任意精度数字,对于任意精度的数学,提供了支持用字符串表示的任意大小和精度的数字的二进制计算。 用编程语言做计算,很多时候浮点数精度都是困扰过我的问题,即便是刚学PHP的新手也会在群里问为什么我的计算结果明显不对,而我们总是老态龙钟的丢出一句浮点数计算都存在精度问题,并没有提出过什么实质性的改善。比如下面的计算 0.57*100: zhgxun-p...

    chaos_G 评论0 收藏0
  • 关于PHP在企业中处理数字加减乘除和对比运算方案

    摘要:如果在中对数字或者字符串加减乘除处理不当的话会导致结果不够严谨,通常的假如你需要处理加减乘除应该会是这样比如出现问题等于比如出现问题等于但假如两个类型不一致或者有精确度缺失就会导致一些问题的存在我们可以使用自带的函数来做加减运算处理设 如果在PHP中对数字或者字符串加减乘除处理不当的话、会导致结果不够严谨,通常的、假如你需要处理加减乘除应该会是这样: $a = 1;$b = 2; $a...

    crossoverJie 评论0 收藏0
  • 设计模式学习笔记:工厂模式

    摘要:二简单工厂模式组成工厂类工厂模式的核心,通过调用它来实现其他类的功能。三工厂方法模式利用工厂方法模式可以有效解决简单工厂模式破坏开闭原则的问题。 一、概念 1、工厂模式分为三类:(1)简单工厂模式:一个工厂创建所有产品(2)工厂方法模式:一个工厂方法创建一个产品(3)抽象工厂模式:一个工厂方法创建一类产品 2、创建型模式这种模式是指将实例的创建和使用分离开来,隐藏类实例的创建细节,外界...

    luxixing 评论0 收藏0
  • PHP 日期加减计算方法示例

    摘要:标准的日期格式简单的日期加减计算默认时区今天今天昨天明天一周后一周零两天四小时两秒后下个星期四上个周一一个月前一个月后十年后运行结果今天今天昨天明天一周后一周零两天四小时 PHP 标准的日期格式 date(Y-m-d H:i:s); PHP 简单的日期加减计算 运行结果: 今天:2017-11-06 今天:2008-06-18 昨天:2017-11-05 明天:2017-11-07 ...

    notebin 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<