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