运算符优先级

运算符优先级指定了两个表达式绑定得有多"紧密"。例如,表达式1 + 5 * 3的结果是16而不是18是因为乘号("*")的优先级比加号("+")高。必要时可以用括号来强制改变优先级。例如:(1 + 5)* 3的值为18

如果运算符优先级相同,那运算符的结合方向决定了该如何运算。例如,"-"是左联的,那么1 - 2 - 3就等同于(1 - 2)- 3并且结果是-4. 另外一方面,"="是右联的,所以$a = $b = $c等同于$a =($b = $c)

没有结合的相同优先级的运算符不能连在一起使用,例如1 < 2 > 1在PHP是不合法的。但另外一方面表达式1 <= 1 == 1是合法的, 因为==的优先级低于<=

括号的使用,哪怕在不是必要的场合下,通过括号的配对来明确标明运算顺序,而非靠运算符优先级和结合性来决定,通常能够增加代码的可读性。

下表按照优先级从高到低列出了运算符。同一行中的运算符具有相同优先级,此时它们的结合方向决定求值顺序。

运算符优先级
结合方向运算符附加信息
clone newclonenew
[array()
**算术运算符
++--~(int)(float)(string)(array)(object)(bool)@类型递增/递减
instanceof类型
!逻辑运算符
*/%算术运算符
+-.算术运算符字符串运算符
<<>>位运算符
<<=>>=比较运算符
==!====!==<><=>比较运算符
&位运算符引用
^位运算符
|位运算符
&&逻辑运算符
||逻辑运算符
??比较运算符
? :ternary
right=+=-=*=**=/=.=%=&=|=^=<<=>>=赋值运算符
and逻辑运算符
xor逻辑运算符
or逻辑运算符

淘宝 adsense 商品推荐

正版 Google AdSense实战宝典:用谷歌广告联盟出海赚美元 第2版 seo搜索引擎优化 广告营销 网站运营书籍 AdSense从入门到精通

价格:37.9元

Example #1 结合方向

<?php
$a = 3 * 3 % 5; // (3 * 3) % 5 = 4
// ternary operator associativity differs from C/C++
$a = true ? 0 : true ? 1 : 2; // (true ? 0 : true) ? 1 : 2 = 2

$a = 1;
$b = 2;
$a = $b += 3; // $a = ($b += 3) -> $a = 5, $b = 5
?>

Operator precedence and associativity only determine how expressions are grouped, they do not specify an order of evaluation. PHP does not(in the general case)specify in which order an expression is evaluated and code that assumes a specific order of evaluation should be avoided, because the behavior can change between versions of PHP or depending on the surrounding code.

Example #2 Undefined order of evaluation

<?php
$a = 1;
echo $a + $a++; // may print either 2 or 3

$i = 1;
$array[$i] = $i++; // may set either index 1 or 2
?>

尽管=比其它大多数的运算符的优先级低,PHP 仍旧允许类似如下的表达式:if(!$a = foo()),在此例中foo()的返回值被赋给了$a