注文

2012-02-24 9 views
5

私は、次の式がある場合:注文

c = (a) * (b) 

はC90標準は部分式「」と「B」の順評価について何を言ってんの?

+8

[Nothing](http://en.wikipedia.org/wiki/Unspecified_behavior):) :) :) – dasblinkenlight

+0

宿題には宿題が必要です。 –

+2

@ロバーツ:宿題でこれを尋ねる人はいないと思っています。 – Bruce

答えて

11

乗算演算子はシーケンスポイントではないため、指定された順序はありません。シーケンスポイントには、コンマ演算子、完全な式の終了、および関数呼び出しが含まれます。従って、(a)(b)の評価の順序は、コンパイラの実装次第である。したがって、(a)には、有効な結果を生成するために、(b)に表示されることを望む副作用を持つものを実行しないでください。例えば

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

あなたがCのためのシーケンスポイントのフルリストをしたい場合は、あなたがmore thorough reference hereをチェックアウトすることができます。

+0

または、さらに良い、SOの検索。 – smparkes

+2

@Bruce:ANSI Cのドラフトhttp://flash-gordon.me.uk/ansi.c.txtを参照してください。附属書A – Christoph

+0

あなたの例では、間違ったコードが実際に表示されますが、評価の順序が原因ではありません。明らかに、 'a ++'が最初に評価されることは重要ではありません。 – ugoren

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; 

はどちらも有効な訳です。