這篇文章不是技術文章也不是教學文章,而是一篇介紹C/C++ Language中模糊的表示式(Ambiguous Expressions)
首先什麼是expression呢?引用ARM(The Annotated C++ Reference Manual)中的說明
《An expression is a sequence of operators and operands that specifies a computation.
An expression may result in a value and may cause side effects. 》
重點是紅字的地方,expression計算到最後的結果不一定是值,可能是side effects,解釋成Ambiguous expressions
或unpredictable expression。
什麼樣的expression是ambiguous expression,在C/C++中有這段一段描述
《 Certain expressions are ambiguous in their meaning. These expressions occur most frequently when an
object's value is modified more than once in the same expression. These expressions rely on a particular
order of evaluation where the language does not define one. 》
在同一個expression中,物件被修改的次數多達一次以上,在語言中沒有定義。在不同的編譯器中會有不一樣的結果。
舉個MSDN中的例子:
::::::::::::::::::::::::::::::::::::::::::::::
//assume i = 6
i = i++; // i may be 6 , or may be 7
::::::::::::::::::::::::::::::::::::::::::::::
這個experssion是無法預期的,為什麼呢?雖然你的compiler仍會完成編譯並且可執行,
但i值可能是i的舊值(old value)也可能是i的新值(new value),在不同的編譯器底下會有不同的結果。
避免在程式有以上的寫法,寫程式要儘量簡單易懂易維護,寫出來的程式只有自己懂這個程式沒有什麼價值,故意
寫出很罕見的程式或別人看不懂的語言,可能真得很行,但可能不穩當。
可以求學問但賣弄或炫耀學問就不是好事情,雖然這是一件很有成就感的事情。
unary increment or decrement operator中會有assignment的動作產生,在使用時,要注意side effects
在expression中使用unary increment or decrement operator無法保證在expression過程中的值
只能保證結束expression時,operand的值。
在程式中若不注意,會出現語言中未定義的expression,此時可能並不會發生問題,也可能出現,但儘量避免
這種使用的出現,在Ambiguous expression中,每個人都會有自己解釋的方式,解釋的方式因人而異,這都
不會絕對的,也並不是語言真正的函義。依循著語言的定義並且在程式的撰寫上更加明確易懂,這就不會出現
Ambiguous expression就不會有side effects的出現,就可以很正確的將語言使用在應用上。
作者會將自己所參考的文章及相關資料列出來,最主要是讓網友能接觸最原始的資料,讀取第一手的資訊
,作者只是將文章整理再加上作主本身的經驗,讓網友們能夠更明瞭。
讓學問技術透明化是作者寫文章的本意。
推薦:
Expressions
Evaluating Function Arguments
參考:
C Language Reference:Side Effects
C++ Language Reference:Ambiguous Expressions
Written By James On 2006/12/02