一道PHP题引出的“短路求值”
生活随笔
收集整理的這篇文章主要介紹了
一道PHP题引出的“短路求值”
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
今天群里有個(gè)人問(wèn)了一個(gè)問(wèn)題,代碼如下: $a = 3; $b = 2; if ($a = 2 || $b = 5) { ??? ++$a; } echo $a; 說(shuō)代碼段的執(zhí)行的結(jié)果為1,問(wèn)大家$a的值為什么不是3。 我看到這段代碼后,和提問(wèn)者的想法一樣,也以為$a的值應(yīng)該是3。 然后就有人說(shuō)了,因?yàn)?| | 的優(yōu)先級(jí)高于 = ,所以($a = 2 || $b = 5)應(yīng)該寫(xiě)成($a = (?2 || $b = 5)), (?2 || $b = 5)的“或”運(yùn)算結(jié)果為T(mén)rue,將它賦值給變量a,所以$a的值為1。 ? 興趣上來(lái)后,我就順手打印了一下變量b的值,發(fā)現(xiàn)變量b的值為2。為什么變量b沒(méi)有被賦值呢?有人提出了一個(gè)概念叫“短路求值”。 “短路求值”的定義如下: 作為"&&"和"||"操作符的操作數(shù)表達(dá)式,這些表達(dá)式在進(jìn)行求值時(shí),只要最終的結(jié)果已經(jīng)可以確定是真或假,求值過(guò)程便告終止,這稱(chēng)之為短路求值(short-circuit evaluation)。 假如expr1和expr2都是表達(dá)式,expr2是否求值視expr1而定: expr1 ||?expr2: ? ??expr1的值為1,則expr2將不會(huì)進(jìn)行求值。 expr1 &&?expr2: ? ??expr1的值為0,則expr2將不會(huì)進(jìn)行求值。 因?yàn)?/span>(?2 || $b = 5)中,先進(jìn)行2的“或”運(yùn)算,結(jié)果為真,則 | | 后面$b = 5的賦值操作就不再執(zhí)行了。 ? 如果將 | | 前面的 2 改成 0: $a = 3; $b = 2; if ($a = 0 || $b = 5) { ??? echo $b;??? // 5 } echo $a;??? // 1 $b的值就是5了,因?yàn)?0 的“或”運(yùn)算結(jié)果為假,則后面會(huì)將5賦值給變量b,又因?yàn)椤盎颉边\(yùn)算是只要兩個(gè)表達(dá)式有一個(gè)為真,其結(jié)果就為真,所以$a的值仍為1。 那么,再將 | | 改成 &&: $a = 3; $b = 2; if ($a = 0 && $b = 5) { ??? var_dump($b);??? // &&后面對(duì)b的賦值操作不進(jìn)行,所以無(wú)輸出 } var_dump($a);??? // false echo $b;????????// 2 因?yàn)? 的“與”運(yùn)算結(jié)果為假,則&&后面不會(huì)再將5賦值給變量b, 又因?yàn)椤芭c”運(yùn)算是只要兩個(gè)表達(dá)式有一個(gè)為假,其結(jié)果就為假,所以$a的值為0。 題外話(huà):這道題雖然看起來(lái)很簡(jiǎn)單,但是經(jīng)過(guò)群里“吃瓜群眾”的討論和講解,我收獲很多。尤其是我在群里說(shuō)“明白了”后,那個(gè)提問(wèn)者還加了我微信,和我探討。非常佩服對(duì)方的鉆研精神,如果我將這種鉆研精神用到工作和學(xué)習(xí)中,想必進(jìn)展一定會(huì)大大的。還要更努力喲~? 又及:運(yùn)算符優(yōu)先級(jí)可參考PHP手冊(cè)的http://www.php.net/manual/zh/language.operators.precedence.php
轉(zhuǎn)載于:https://www.cnblogs.com/sunshineliulu/p/7781031.html
總結(jié)
以上是生活随笔為你收集整理的一道PHP题引出的“短路求值”的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。