2012-02-24 91 views
5

如果我有以下表現:訂購的C表達式評價

c = (a) * (b) 

什麼是C90的標準說的子表達式「A」和「B」的順序評價?

+8

[Nothing](http://en.wikipedia.org/wiki/Unspecified_behavior):) :) :) :) – dasblinkenlight 2012-02-24 20:39:30

+0

家庭作業題目需要作業標籤。 – 2012-02-24 20:41:28

+2

@Robert:我認爲沒有人會在作業中提出這樣的問題...... – Bruce 2012-02-24 20:42:01

回答

11

由於乘法運算符不是序列點,因此沒有指定的順序。序列點包括逗號運算符,完整表達式的結尾和函數調用。因此,(a)(b)的評估順序取決於編譯器的實現。因此,您不應該嘗試執行(a)中的某些操作,該操作會產生您想要在(b)中看到的副作用,以便生成有效結果。

例如:

int a=5; 
int b = (a++) * (a++); //<== Don't do this!! 

如果你想要的順序點對C全上市,你可以檢查出一個more thorough reference here

+0

或者,甚至更好,SO搜索。 – smparkes 2012-02-24 20:43:44

+2

@Bruce:參見ANSI C草案http://flash-gordon.me.uk/ansi.c.txt,附錄A.2 – Christoph 2012-02-24 20:45:53

+0

您的示例確實顯示了錯誤的代碼,但不是由於評估順序。顯然,首先評估「a ++」是不重要的。 – ugoren 2012-02-24 22:00:19

3

在C90中未指定*二元運算符的操作數的求值順序。

下面是從C90標準的有關段落(如詢問C90的問題):

(C90,6.3)「除了通過語法或指示不然以後規定(用於函數調用運算符(),& &,||,?,頓號,運營商)的子表達式的計算順序和順序副作用的發生都是unspecitied」

對於*運營商,如果我們以副作用操作數爲例:

c = f() * g(); 

實現可以調用f()第一或g()第一:

a = f(); 
b = g(); 
c = a * b; 

a = g(); 
b = f(); 
c = a * b; 

都是有效的翻譯。