當(dāng)前位置:博客首頁>>PHP >> 閱讀正文

【PHP】&&與and的’別名’關(guān)系

作者: 鄭曉 分類: PHP 發(fā)布于: 2013-02-21 12:18 瀏覽:5,369 評論(2)


這個應(yīng)該是我們新手編程過程中一直忽略的一個細節(jié):
&&、||與AND、OR一樣嗎?它們只是別名關(guān)系?

php執(zhí)行源碼時的整個過程為,首先按照zend_language_scanner.l中定義的,將源碼中的echo、if之類的語言結(jié)構(gòu)轉(zhuǎn)換成類似的T_ECHO、T_IF這些token,并且會去掉源碼中的空格,注釋這些與程序邏輯無關(guān)的字符。,就形成了一些簡短的表達式,這就是詞法分析階段。然后會按照zend_vm_opcodes.h中定義的,將這些token轉(zhuǎn)換為op code。然后一條一行的執(zhí)行這些op code。

上面大概解釋了php的編譯和執(zhí)行的過程,以及語言結(jié)構(gòu)的定義。下面進入正題。

我先坦白,之前我一直以為一樣,以為是純粹的別名關(guān)系。但今天看到源碼后,發(fā)現(xiàn)完全是不同的token。拿&&和AND舉例:

還是zend_language_scanner.l

<ST_IN_SCRIPTING>”&&” {
return T_BOOLEAN_AND;
}

<ST_IN_SCRIPTING>”AND” {
return T_LOGICAL_AND;
}

一個叫布爾”與”,一個叫邏輯”與”

之所以使用不同的token。那必然有不同之處。這里我也不賣關(guān)子了,google能找到很多答案,其實這兩個最實質(zhì)的區(qū)別就是優(yōu)先級不同:

$a = 1 && 0;
$b = 1 AND 0;
var_dump($a);
var_dump($b);

前者會嘗試先計算1 && 0,得到結(jié)果后再賦給$a,后者會先將1賦給$b;所以結(jié)果為
bool(false) int(1)

這下大家應(yīng)該清楚這里的細節(jié)了,PHP中&&與AND還是存在一定差異的,用的時候需要注意下。

? ? ? ?

本文采用知識共享署名-非商業(yè)性使用 3.0 中國大陸許可協(xié)議進行許可,轉(zhuǎn)載時請注明出處及相應(yīng)鏈接。

本文永久鏈接: http://www.yjfs.org.cn/php-and-another-name.html

【PHP】&&與and的’別名’關(guān)系:目前有2 條留言

用戶評論頭像 三防漆發(fā)表于 2013年02月22日 14:22[回復(fù)]

不光是php里面是的,c語言等其他語言也是有區(qū)別的

    用戶評論頭像 鄭曉發(fā)表于 2013年02月22日 14:27[回復(fù)]

    嗯,后來查了一下其實就是運算優(yōu)先級的問題…基礎(chǔ)沒學(xué)好啊~~~

發(fā)表評論

change vcode