專家詳解:復(fù)雜表達(dá)式的執(zhí)行步驟_.Net教程
推薦:教你簡(jiǎn)單方便獲取Web設(shè)計(jì)的免費(fèi)資源擁有大量預(yù)算作為后盾的 Web 設(shè)計(jì)人員可以獲得任何所需的資源,從而可以把他們的想像力付諸于 Web 體驗(yàn)。他們可以聘請(qǐng)專業(yè)攝像師來(lái)制作引人注目的照片;可以請(qǐng)最好的 HTML 和 CSS 專家來(lái)創(chuàng)建適
近日在CSDN上閑逛的時(shí)候,注意到一個(gè)帖子:
((*strDest =*strSrc )!='\0'); 哪兒前輩可以解釋下里面具體執(zhí)行的步驟呢?
對(duì)于這樣的表達(dá)式,我們通常會(huì)有這樣三種看法:
1.這種寫法不但沒有錯(cuò)誤(當(dāng)然也沒有BUG),而且寫法緊湊。
2.這種寫法雖然沒有錯(cuò)誤,但是不夠直觀,理解起來(lái)有點(diǎn)麻煩,可能還會(huì)導(dǎo)致理解錯(cuò)誤。
3.這種寫法中存在未定義的地方,執(zhí)行結(jié)果可能是錯(cuò)誤的。
粗略來(lái)看,這三種說(shuō)法都有點(diǎn)道理。我頓時(shí)有了刨根問底的興趣,想對(duì)這個(gè)問題進(jìn)行一次深入的分析。對(duì)于這種組合表達(dá)式,在分析的時(shí)候我們應(yīng)該抓住兩個(gè)關(guān)鍵的概念:優(yōu)先級(jí)(Precedence)和關(guān)聯(lián)性(Associativity)。
1.優(yōu)先級(jí)(Precedence)。優(yōu)先級(jí)決定了那些表達(dá)式的值先被評(píng)估,那些表達(dá)式的值后被評(píng)估。通常情況下,優(yōu)先級(jí)高的表達(dá)式的值先被評(píng)估出來(lái)后,然后用評(píng)估的結(jié)果再去評(píng)估那些優(yōu)先級(jí)低的表達(dá)式。所以如果我們將優(yōu)先級(jí)搞反了,評(píng)估出來(lái)的結(jié)果是錯(cuò)誤的。
2.(Associativity)。對(duì)于二目表達(dá)式,關(guān)聯(lián)性決定了左邊的表達(dá)式還是右邊的表達(dá)式先被評(píng)估,先被評(píng)估出來(lái)的結(jié)果再用來(lái)評(píng)估另外的表達(dá)式。
再抓住這兩個(gè)關(guān)鍵的同時(shí),我們還應(yīng)該分清什么是表達(dá)式的值,什么是變量的值。我們?cè)谠u(píng)估表達(dá)式的時(shí)候,我們感興趣的是表達(dá)式的值,而不是構(gòu)成表達(dá)式的某些變量的值。在很多情況下,表達(dá)式的值和某些變量的值是一致的,所以我們很容易混淆表達(dá)式的值和變量的值。要知道,在有些情況下,表達(dá)式的值并不和某些變量的值相同。
有了上面的理論來(lái)武裝我們,對(duì)表達(dá)式的分析就顯得游刃有余了:
1. 很明顯,上面的表達(dá)式是一個(gè)組合表達(dá)式。組合表達(dá)式由子表達(dá)式組成,子表達(dá)式又可能是組合表達(dá)式,這樣就形成了一個(gè)樹狀的數(shù)據(jù)結(jié)構(gòu)。對(duì)表達(dá)式的評(píng)估就類似于對(duì)樹結(jié)點(diǎn)的遍歷。首先我們應(yīng)該注意到"()"操作符,它具有最高的優(yōu)先級(jí),所以從整體來(lái)看,整個(gè)表達(dá)式應(yīng)該是個(gè)"!="操作。"!="左邊又是一個(gè)組合表達(dá)式,而右邊是一個(gè)常量"\0',很明顯下面的工作就是評(píng)估(*strDest =*strSrc )。
2.在這一步,我們要對(duì)表達(dá)式(*strDest =*strSrc )進(jìn)行評(píng)估。由于賦值表達(dá)式具有較低的優(yōu)先級(jí),所以表達(dá)式 又可以寫成:(*strDest ) = (*strSrc ),所以整個(gè)表達(dá)式是個(gè)"="操作,"="左邊又是一個(gè)組合表達(dá)式,右邊也是一個(gè)組合表達(dá)式,這里就需要從關(guān)聯(lián)性來(lái)判斷左邊還是右邊也被評(píng)估。由于"="的關(guān)聯(lián)性是從右到左,所以(*strSrc )先被評(píng)估,(*strDest )后被評(píng)估。
2.1 在這一步,我們要對(duì)表達(dá)式(*strSrc )進(jìn)行評(píng)估。由于" "的優(yōu)先級(jí)大于"*",所以表達(dá)式又可以寫成:*(strSrc )。我們要先對(duì)表達(dá)式strSrc 進(jìn)行評(píng)估,然后用表達(dá)式的值再去評(píng)估*(strSrc )的值。對(duì)于表達(dá)式strSrc ,這里要需要注意區(qū)分變量的值和表達(dá)式的值。對(duì)于"后增1"表達(dá)式,表達(dá)式的值是變量strSrc的值,然后變量strSrc的值會(huì)"加1",也就是說(shuō)表達(dá)式的值是strSrc變化前的值,而strSrc的值會(huì)發(fā)生變化。值得注意的是,我們知道strSrc的值會(huì)發(fā)生變化,但是我們卻不知道strSrc的值發(fā)生變化的具體時(shí)間,這個(gè)變化具體的執(zhí)行時(shí)間由編譯器決定了,這就決定了任何依賴strSrc的表達(dá)式的值是不確定的,具體的值依賴編譯器的實(shí)現(xiàn)。完成了對(duì)strSrc 的評(píng)估后,取值操作符就對(duì)表達(dá)式的值所對(duì)應(yīng)的內(nèi)存空間進(jìn)行取值操作。
2.2 在這一步,我們要對(duì)表達(dá)式(*strDest )進(jìn)行評(píng)估。具體的評(píng)估的分析完全和2.1中的分析一致。
2.3 在這一步,我們要對(duì)表達(dá)式(*strDest ) = (*strSrc )進(jìn)行評(píng)估,這是個(gè)賦值表達(dá)式,將右表達(dá)式的值賦給左邊表達(dá)式的值。值得注意的是,對(duì)于賦值表達(dá)式,表達(dá)式本身的值等于左邊子表達(dá)式的值。
3.由于"!="表達(dá)式左邊的子表達(dá)式的值已經(jīng)被評(píng)估出來(lái)了,下面就執(zhí)行"!="操作。"!="表達(dá)式的是一個(gè)布爾值。
通過(guò)以上深入的分析,我們知道這個(gè)表達(dá)式完成了以下多個(gè)功能:
1.對(duì)于指針strDest, strSrc,將strSrc所指的內(nèi)存空間的值賦給由strDest所指的內(nèi)存空間。
2.判斷賦值后的strDest所指的內(nèi)存空間的指是否等于0。
3.對(duì)于指針strDest,strSrc,他們的值分別加1,即指向下一個(gè)元素。
我們可以看出,一個(gè)表達(dá)式完成了三個(gè)功能,表達(dá)式寫的確實(shí)"相當(dāng)緊湊"。而且這個(gè)表達(dá)式的值是可以確定的,因?yàn)樗械姆治龆际墙⒃贑 標(biāo)準(zhǔn)的基礎(chǔ)上。對(duì)于能否在實(shí)踐的代碼中使用這樣的代碼,這就智者見智了,關(guān)鍵一點(diǎn)就是要遵循項(xiàng)目的代碼規(guī)范。
分享:菜鳥也學(xué)習(xí)ASP.NET如何讀取數(shù)據(jù)庫(kù)內(nèi)容有的網(wǎng)友說(shuō),不會(huì)C#,在ASP.NET里面還是選擇VB.NET,這個(gè)我不反對(duì),但是我覺得既然是學(xué)習(xí)新的東西,就不要在意有多少是新的。實(shí)際上C#就一般的操作來(lái)說(shuō),只是區(qū)分大小寫和多了一個(gè)分號(hào)這兩點(diǎn)與V
- asp.net如何得到GRIDVIEW中某行某列值的方法
- .net SMTP發(fā)送Email實(shí)例(可帶附件)
- js實(shí)現(xiàn)廣告漂浮效果的小例子
- asp.net Repeater 數(shù)據(jù)綁定的具體實(shí)現(xiàn)
- Asp.Net 無(wú)刷新文件上傳并顯示進(jìn)度條的實(shí)現(xiàn)方法及思路
- Asp.net獲取客戶端IP常見代碼存在的偽造IP問題探討
- VS2010 水晶報(bào)表的使用方法
- ASP.NET中操作SQL數(shù)據(jù)庫(kù)(連接字符串的配置及獲取)
- asp.net頁(yè)面?zhèn)髦禍y(cè)試實(shí)例代碼
- DataGridView - DataGridViewCheckBoxCell的使用介紹
- asp.net中javascript的引用(直接引入和間接引入)
- 三層+存儲(chǔ)過(guò)程實(shí)現(xiàn)分頁(yè)示例代碼
- 相關(guān)鏈接:
- 教程說(shuō)明:
.Net教程-專家詳解:復(fù)雜表達(dá)式的執(zhí)行步驟
。