摘要:起因是这样的,我们都知道语法里有自增操作,即,那么下面我列出一个表达式好的,为什么等于只有一种解释,就是自增的优先级高于加减,所以二号位自增导致了一号位也变成。但是,它们的值都是。
这可能算不上是一次正规的解说,毕竟有点烧脑。
起因是这样的,我们都知道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中对数字或者字符串加减乘除处理不当的话、会导致结果不够严谨,通常的、假如你需要处理加减乘除应该会是这样: $a = 1;$b = 2; $a...
摘要:二简单工厂模式组成工厂类工厂模式的核心,通过调用它来实现其他类的功能。三工厂方法模式利用工厂方法模式可以有效解决简单工厂模式破坏开闭原则的问题。 一、概念 1、工厂模式分为三类:(1)简单工厂模式:一个工厂创建所有产品(2)工厂方法模式:一个工厂方法创建一个产品(3)抽象工厂模式:一个工厂方法创建一类产品 2、创建型模式这种模式是指将实例的创建和使用分离开来,隐藏类实例的创建细节,外界...
摘要:标准的日期格式简单的日期加减计算默认时区今天今天昨天明天一周后一周零两天四小时两秒后下个星期四上个周一一个月前一个月后十年后运行结果今天今天昨天明天一周后一周零两天四小时 PHP 标准的日期格式 date(Y-m-d H:i:s); PHP 简单的日期加减计算 运行结果: 今天:2017-11-06 今天:2008-06-18 昨天:2017-11-05 明天:2017-11-07 ...
阅读 3041·2021-11-24 10:34
阅读 3292·2021-11-22 13:53
阅读 2587·2021-11-22 12:03
阅读 3572·2021-09-26 09:47
阅读 2980·2021-09-23 11:21
阅读 4673·2021-09-22 15:08
阅读 3242·2021-07-23 10:59
阅读 1225·2019-08-29 18:31