C程式碼的意外

作者 : Mentor嵌入式軟體技術專家

語言能夠以多種不同的方式寫程式碼,但有一個問題:用兩段特性執行表面上看起來完全一樣的功能,卻有不同的差異...

C語言(C language)非常靈活且更容易表達;這就是C語言很成功並且一直沒有被「更好的」語言改變或取代的部份原因。例如,C語言的靈活性使其得以採用多種不同的方式編寫程式碼,而實現的功能是相同的,這使得每個人都能根據自己的需要形成不同的編碼風格。然而,這其中存在某種「內幕」:有時候,看來明顯等效的程式碼仍然存在細微差異。這種情況可能發生在最簡單的程式碼中,本文將探討一些可能發生的情況。

在C語言中,利用幾種不同的方式來完成同一件事,這是很常見的,畢竟這些方式達到的效果完全相同。例如,假設x是一個普通的int變量,以下每個語句都將完成相同的任務:

 

 

使用其中的每一種方法,x都會加1。唯一可能的區別是,能力較弱的編譯器可能會在最後兩種方法產生稍好一點的程式碼(這暗示著擁有更好的編譯器是值得的)。

使用這種方式,上面兩種形式的++運算符會產生相同的結果。但是,如果如用表達式的值,那麼前增量(pre-increment)和後增量(post-increment)是不同的,因此:

y=x++; // y在增量前被賦值
y=++x; // y在增量後被賦值

有趣的是,後增量稍微「昂貴」一些,因為需要分配儲存空間以保留x的舊值。但是,編譯器可能會對此進行最佳化。如果在不使用表達式的值時分配儲存,那麼肯定需要一個新的編譯器!

如果x不是int值本身,而是指向int值的指針,則加1會產生加4 (在32位元機器上)的效果。如果對此感到驚訝,就有必要復習一下指針運算了。

然而,有時看似等效的表達方式會有非常細微的差異…

無論採用哪一種編程語言,你所能做的最簡單的事情就是為變量賦值。所以,使用C語言時,我們可以這樣寫:

 

 

當然,也可以更緊湊地寫成這樣:

 

 

這些都是100%等效的,對嗎?

…繼續閱讀請連結EDN Taiwan網站

 

 

C語言

加入我們官方帳號LINE@,最新消息一手掌握!

發表評論