運(yùn)算符優(yōu)先級(jí)是一個(gè)程序員必須了解并且撐握的一個(gè)重要的知識(shí)點(diǎn)了,下面我們一起來(lái)看看PHP運(yùn)算符優(yōu)先級(jí)文章吧,今天在老王的技術(shù)手冊(cè)看到一個(gè)問(wèn)題,代碼如下:
<?phpif ($a = 100 && $b = 200) { var_dump($a, $b);}
輸出是什么?
這個(gè)問(wèn)題, 咋一看或許覺(jué)得簡(jiǎn)單, 但其實(shí)仔細(xì)推敲并不簡(jiǎn)單,如果說(shuō)布爾與之前的部分, 是由于優(yōu)先級(jí)的問(wèn)題, 但是如果僅僅是優(yōu)先級(jí)的問(wèn)題的話, 那么結(jié)果應(yīng)該是:
$a = (100 && $b) = 200
而實(shí)際上的結(jié)果, 確實(shí)高優(yōu)先級(jí)的&&讓步給次優(yōu)先級(jí)的=, 讓 $b = 200 先結(jié)合了.究其原因, 是因?yàn)镻HP并不完全遵守優(yōu)先級(jí)的定義, 這個(gè)在PHP的手冊(cè)中也有說(shuō)明:
Note: Although = has a lower precedence than most other operators, PHP will still allow expressions similar to the following: if (!$a = foo()), in which case the return value of foo() is put into $a.
這樣的設(shè)計(jì), 個(gè)人不發(fā)表看法, 反正在C語(yǔ)言中, 這樣類似的語(yǔ)句是判定為語(yǔ)法錯(cuò)的. PHP采用這樣的設(shè)計(jì), 很可能是歷史原因,有好奇的同學(xué), 會(huì)想知道到底為什么, 之前jayeeliu網(wǎng)友也問(wèn)過(guò):
laruence你好:
問(wèn)一個(gè)php運(yùn)算符優(yōu)先級(jí)的問(wèn)題,代碼如下:
$t == 1 && $tt = 2
按照php運(yùn)算符優(yōu)先級(jí)應(yīng)該是
(($t == 1) && $tt) = 2
這個(gè)順序執(zhí)行,但實(shí)際上應(yīng)該是
($t == 1) && ($tt = 2)
我有些不太理解,其實(shí)也簡(jiǎn)單,運(yùn)算符優(yōu)先級(jí)是在存在二義性文法的時(shí)候的一種規(guī)約規(guī)則選擇的手段, 而PHP的語(yǔ)法分析文件定義中, 卻讓等號(hào)和T_BOOLEAN_AND(&&)之前不存在了規(guī)約沖突,實(shí)例代碼如下:
最后, 順便說(shuō)一下, PHP對(duì)應(yīng)于T_BOOLEAN_AND 還定義了 T_LOGICAL_AND(and) 和 T_LOGICAL_OR(or) , 這倆個(gè)的優(yōu)先級(jí)都低于等號(hào), 于是就會(huì)有了, 很多PHP入門教材示例代碼中經(jīng)典的:
$result = mysql_query(*) or die(mysql_error());
類似的還可以用or來(lái)實(shí)現(xiàn)三元操作符(?:)的功能,代碼如下:
$person = $who or $person = "laruence";//等同于:$person = empty($who)? "laruence" : $who;
結(jié)合方向
運(yùn)算符
左 ,
左 or
左 xor
左 and
右 print
右 = += -= *= /= .= %= &= |= ^= ~= <<= >>=
左 ? :
左 ||
左 &&
左 |
左 ^
左 &
無(wú) == != === !==
無(wú) < <= > >=
左 << >>
左 + - .
左 * / %
右 ! ~ ++ -- (int) (float) (string) (array) (object) @
右 [
無(wú) new