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

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

作者: 鄭曉 分類(lèi): PHP 發(fā)布于: 2013-02-21 12:18 瀏覽:5,461 評(píng)論(2)


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

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

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

我先坦白,之前我一直以為一樣,以為是純粹的別名關(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;
}

一個(gè)叫布爾”與”,一個(gè)叫邏輯”與”

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

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

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

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

? ? ? ?

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

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

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

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

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

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

    嗯,后來(lái)查了一下其實(shí)就是運(yùn)算優(yōu)先級(jí)的問(wèn)題…基礎(chǔ)沒(méi)學(xué)好啊~~~

發(fā)表評(píng)論

change vcode