熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> .NET編程 >> 正文

復雜表達式的執行步驟 - .Net編程

2013-11-13 10:54:18  來源: .NET編程 

  近日在CSDN上閒逛的時候注意到一個帖子

  ((*strDest =*strSrc )!=\) 哪兒前輩可以解釋下裡面具體執行的步驟呢?

  對於這樣的表達式我們通常會有這樣三種看法

  這種寫法不但沒有錯誤(當然也沒有BUG)而且寫法緊湊

  這種寫法雖然沒有錯誤但是不夠直觀理解起來有點麻煩可能還會導致理解錯誤

  這種寫法中存在未定義的地方執行結果可能是錯誤的

  粗略來看這三種說法都有點道理我頓時有了刨根問底的興趣想對這個問題進行一次深入的分析對於這種組合表達式在分析的時候我們應該抓住兩個關鍵的概念優先級(Precedence)和關聯性(Associativity)

  優先級(Precedence)優先級決定了那些表達式的值先被評估那些表達式的值後被評估通常情況下優先級高的表達式的值先被評估出來後然後用評估的結果再去評估那些優先級低的表達式所以如果我們將優先級搞反了評估出來的結果是錯誤的

  (Associativity)對於二目表達式關聯性決定了左邊的表達式還是右邊的表達式先被評估先被評估出來的結果再用來評估另外的表達式

  再抓住這兩個關鍵的同時我們還應該分清什麼是表達式的值什麼是變量的值我們在評估表達式的時候我們感興趣的是表達式的值而不是構成表達式的某些變量的值在很多情況下表達式的值和某些變量的值是一致的所以我們很容易混淆表達式的值和變量的值要知道在有些情況下表達式的值並不和某些變量的值相同

  有了上面的理論來武裝我們對表達式的分析就顯得游刃有余了

   很明顯上面的表達式是一個組合表達式組合表達式由子表達式組成子表達式又可能是組合表達式這樣就形成了一個樹狀的數據結構對表達式的評估就類似於對樹結點的遍歷首先我們應該注意到()操作符它具有最高的優先級所以從整體來看整個表達式應該是個!=操作!=左邊又是一個組合表達式而右邊是一個常量\很明顯下面的工作就是評估(*strDest =*strSrc )

  在這一步我們要對表達式(*strDest =*strSrc )進行評估由於賦值表達式具有較低的優先級所以表達式 又可以寫成(*strDest ) = (*strSrc )所以整個表達式是個=操作=左邊又是一個組合表達式右邊也是一個組合表達式這裡就需要從關聯性來判斷左邊還是右邊也被評估由於=的關聯性是從右到左所以(*strSrc )先被評估(*strDest )後被評估

   在這一步我們要對表達式(*strSrc )進行評估由於 的優先級大於*所以表達式又可以寫成*(strSrc )我們要先對表達式strSrc 進行評估然後用表達式的值再去評估*(strSrc )的值對於表達式strSrc 這裡要需要注意區分變量的值和表達式的值對於後增表達式表達式的值是變量strSrc的值然後變量strSrc的值會也就是說表達式的值是strSrc變化前的值而strSrc的值會發生變化值得注意的是我們知道strSrc的值會發生變化但是我們卻不知道strSrc的值發生變化的具體時間這個變化具體的執行時間由編譯器決定了這就決定了任何依賴strSrc的表達式的值是不確定的具體的值依賴編譯器的實現完成了對strSrc 的評估後取值操作符就對表達式的值所對應的內存空間進行取值操作

   在這一步我們要對表達式(*strDest )進行評估具體的評估的分析完全和中的分析一致

   在這一步我們要對表達式(*strDest ) = (*strSrc )進行評估這是個賦值表達式將右表達式的值賦給左邊表達式的值值得注意的是對於賦值表達式表達式本身的值等於左邊子表達式的值

  由於!=表達式左邊的子表達式的值已經被評估出來了下面就執行!=操作!=表達式的是一個布爾值

  通過以上深入的分析我們知道這個表達式完成了以下多個功能

  對於指針strDest strSrc將strSrc所指的內存空間的值賦給由strDest所指的內存空間

  判斷賦值後的strDest所指的內存空間的指是否等於

  對於指針strDeststrSrc他們的值分別加即指向下一個元素

  我們可以看出一個表達式完成了三個功能表達式寫的確實相當緊湊而且這個表達式的值是可以確定的因為所有的分析都是建立在C 標准的基礎上對於能否在實踐的代碼中使用這樣的代碼這就智者見智了關鍵一點就是要遵循項目的代碼規范


From:http://tw.wingwit.com/Article/program/net/201311/14746.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.