運算子優先順序(priority of operator)
考考各位,1+2*3 = ?
,相信對大家來說很簡單,正確答案是7
但是為什麼答案是7不是9呢?,這是因為在我們的計算習慣中,要「先計算乘除,後計算加減」
也就是說乘除的計算優先順序比加減來得高
同樣的,在PHP中,各個運算子在計算時也有優先順序之分
如同我們習慣的計算方式,PHP中也可以使用括號()
來提高計算的優先順序
Ex.(1+2)*3 = 9
下面列出PHP中的運算子的運算優先順序
由運算優先權最高(最上面)排至最低(最下面)
結合方向 | 運算子 | 說明 | ||
---|---|---|---|---|
無 | clone new | 物件操作 | ||
左 | [ | 新增array() | ||
右 | ++ -- ~ - (int) (float) (string) (array) (object) (bool) @ | 遞增遞減與強制轉型 | ||
無 | instanceof | |||
右 | ! | |||
左 | * / % | |||
左 | + - . | |||
左 | <<>> | |||
無 | <<= >>= <> | |||
無 | == != === !== | |||
左 | & | |||
左 | ^ | |||
左 | \ | |||
左 | && | |||
左 | \ | \ | ||
左 | ? : | 三元運算子 | ||
右 | = += -= *= /= .= %= &= \ | = ^= <<= >>= => | ||
左 | and | |||
左 | xor | |||
左 | or | |||
左 | , |
這邊跟大家講解一下結合方向的意義
舉例來說12/6/2
,正確的運算結果是1,而不是4
這是因為除法是由左至右計算,先計算左邊再計算右邊
所以運算的方式是(12/6)/2
,而不是12/(6/2)
這時我們就稱除法的結合方向是左往右,從左邊開始,簡稱為「左」
所以如果碰到優先順序相同的運算子,則依據運算子的結合方向決定先做左或右邊。
來個結合方向的範例
<?php
// 結合方向: 左
var_dump(7 * 3 / 3); // int(7), => 21 / 3
var_dump(7 / 3 * 3); // float(7), => 2.3333.. * 3 先轉為float
// 結合方向: 右
$a = 1;
$b = 2;
$a = $b += 3; // $b = 5, $a = 5
?>
但凡事總有例外,有時候指派運算符=
雖然運算排序較後,但仍然會被先進行運算
<?php
$a = false;
$b = true;
var_dump(!$a = $b); // bool(false)
?>