各种编程语言的运算符都是有优先级的,不注意优先级的话很容易造成与预期不符的结果。PHP 中不同优先级的运算符可归为22项,要将它们按顺序一一记住确实不大容易,不过我们并不需要这么做,因为毕竟平时常用的运算符只是一部分,我们只需记住这部分的优先级即可,而如果有使用到其它运算符时有不太明确的地方再查表(PHP:运算符优先级 – PHP手册)也不迟。
我们常用的 PHP 运算符优先级如下:
递增/递减 > 逻辑非 !> 算术运算符 > 大小比较 >(不)相等比较 > 引用 > 位运算符 ^ > 位运算符 | > 逻辑与 && > 逻辑或 || > 三目 ?: > 赋值 > and > xor > or
其中红字部分运算符最常用到,我们可以将这部分优先级顺序简记为【一算二比三逻辑四赋值】。
此外要注意的一点是,&& 和 || 与 and 和 or 虽然作用是一样的,但是它们的优先级却不同。&& 和 || 的优先级高于赋值运算符,执行时先逻辑后赋值;而 and 和 or 的优先级低于赋值运算符,执行时先赋值后逻辑。
示例:
<?php
$a=false || true;
$b=false or true;
var_dump($a); //boolean(true)
var_dump($b); //boolean(false)
?>
考察 PHP 运算符优先级的经典面试真题
请写出下列程序输出的结果:
<?php
$a=0;
$b=0;
if($a=3>0 || $b=3>0){
$a++;
$b++;
echo $a.'<br/>';
echo $b;
}
?>
解析:
1. 首先要明确条件判断语句中出现的几种运算符的优先级为 > > || > = ;
2. 根据优先级先执行两个比较运算【3>0】,结果均为 true,于是条件判断语句变成【$a=true || $b=true】;
3. 之后执行逻辑或 || 运算,不过根据该运算符的短路作用,只要它前面的值为 true,则后面的赋值运算【$b=ture】将会被忽略不会执行,于是条件判断语句变成【$a=true】;
4. 最后执行赋值运算【$a=true】,结果 $a=true,条件判断语句结果为 true,而 $b=0 不变;
5. 进入条件执行语句,由于递增/递减运算符不影响布尔值,所以【$a++】后 $a=true 不变;而【$b++】后 $b=1;
6. 执行 echo,$a 与 $b 均输出1。
最后,就如 PHP 手册里说的那样:哪怕在不是必要的场合下,通过括号的使用来明确标明运算顺序,而非靠运算符优先级来决定,可以增加代码的可读性。推荐使用!