优先级问题确实是比较让人郁闷的问题,有时候出错了,查找半天最后才发现是它的问题。下面这个问题也是很常见的一个。
<?php
$a = 3;
$b = 5;
if( $a = 5 || $b = 7 ) {
$a++;
$b++;
}
echo $a . ", " . $b;
a和b分别为什么呢?不运行 先猜一猜。
第一眼看上去 不假思索的话 相信很多人说是6, 8
然后稍加思索的话 可能会选 6, 6
然后再思索的话 可能结果是2, 6
当然 这只是我的臆测哈 然而最终结果是啥呢?运行一下结果显示: 1, 6
为什么会是1,6呢 我们一起分析一下流程。
赋值部分不用说了 简单的a = 3, b = 5;
然后关键就在于if条件语句了 即:a = 5 || b = 7;
我们知道优先级中 逻辑运算符|| 是高于 赋值运算符=的,那么以上的式子可以写成
a = 5 (||) b = 7
而我们又知道,这个式子是从左向右执行的,而且 赋值运算符的方向是 从右到左 ,于是这个式子可以转化为
a = ( 5 (||) b = 7 )
恩 这里也有个小陷阱哈, a 的值是什么呢?
我们应该知道,逻辑运算符是返回boolean类型结果的,那么,此处a的值就应该是true,而不是我们都认为的5。
而b呢? 再看5||b=7 逻辑运算符结构中方向也是从左至右的,那么5为true之后就不会往右执行,而直接返回true了,所以b不会被赋值。
接下来进入if的结构体中。
$a++;
$b++;
b是没问题的, 没有被覆盖, 所以还是开始被赋值的5, ++自增之后为6;
a呢? 这里就有个小知识点了.
首先我们已经知道a的值现在为true, 然后, 我们可以看看php手册关于运算符一节中-> 递增/递减运算符,
在开始部分有一个主意事项
Note: 递增/递减运算符不影响布尔值。
递减 NULL 值也没有效果,但是递增 NULL 的结果是 1。
所以, 最后echo结果为1, 6。
可以运行试一下哈 可以在if里面var_dump($a, $b);
也可以在echo前面var_dump($a, $b);
证明a的类型是bool(true)的。