2011-01-10 9 views
3

可能性の重複:
C#: Order of function evaluation (vs C)挙動と注文

コードスニペット:

i += ++i; 
a[++i] = i; 
int result = fun() - gun(); 
//statement of similar kind 

は、彼らの行動は、C#で明確に定義されていますか? C++では、このようなコードは undefined/unspecified behaviorを呼び出します。また、あなたの回答の言語仕様から関連するセクションを引用してください!

+2

[C#:関数評価の順序(vs C)](http://stackoverflow.com/questions/1215236/c-order-of-function-evaluation)では、さまざまな人々から回答が得られません。 -vs-c)? – Gabe

+0

@ Gabe:私の質問の最初の2つのステートメントは、他のトピックで説明したステートメントと少し異なります。私は間違っているかもしれません。 – Nawaz

+0

@All:このトピックを閉じるために投票しないでください。私の質問の最初の2つの文に何らかの答えがあっても害はありません。 – Nawaz

答えて

9

ここでのキーは、「1.4式」の表と「7.3.1演算子の優先順位と結合性」です。私は1.4からテーブルを複製することはありませんが、7.3.1引用する:、 すべてのバイナリ演算子は左から 操作が実行されることを意味し、 左結合されている代入演算子を除き

  • 例えば、x + y + zは(x + y)+ zとして評価される である。
  • 代入演算子と 条件演算子(?:) 操作が適切に 左から行われることを意味し、右結合 あります。たとえば、x = y = zはx =(y = z)と評価される です。

最初論理が拡大(または:結合性ルールを使用)であるとして:

ここ
i = i + ++i; 

、(表からの)順序は、添加剤次いで、プリインクリメントされ、その後割り当て - 私は私が倍増することを期待する必要があります。そして実際には、i=6を使用すると、期待どおりに13が得られます。

a[++i] = i; 

再びテーブルから、順序が配列アクセス、プリインクリメント、割り当てなければならない - 私は私+ 1番目の値i + 1であることが期待されます。実際には、確認:

int[] a = { 0, 0, 0, 0, 0 }; 
    int i = 2; 
    a[++i] = i; 

私たちは確かに{0, 0, 0, 3, 0}を取得します。

最後に、メソッドの呼び出しは減算よりも優先され、次に左から右になります。そのため、fun()gun()-の割り当てが必要です。

+0

または 'gun()、fun()、 - assignment ' – leppie

+0

@leppie - 左結合、確かに(セクション7.3.1) –

+0

値だけで、それゆえ評価された後(メソッドが呼び出された後)。一般的に、それは右に残っていますが、私は保証を見ません。 – leppie

10

人々はこれを常に混乱させます。これはC#では非常に簡単なので不幸です。ルールは、次のとおり

  • 部分式は、を評価することが観察された実行中のスレッド、期間から観察したとき、右に物語の左端。 (評価の順序は、他のスレッドが副作用を見ている場合には、他のスレッドによって異なることが認められています。)

  • オペレータの実行順序は、その優先順位と結合性によって決まります。

これらは、関連する唯一の2つのルールであり、与えたコードの動作を完全に定義します。

i += ++i; 

に最初のiは、iが評価され、その後++、評価され、その後、+ =が実行されます。

a[++i] = i; 

最初に評価される「」、その後、++ iは、私が評価され、インデックスオペレータが実行され、その後、評価され、その後、割り当てが行われます。

int result = fun() - gun(); 

最初の結果が評価され、次に楽しく、次にガンが減算され、次に割り当てられます。

応答の言語仕様の関連セクションも引用してください。

あなたは完全に目次を見ることができます。見つけにくいです。

+0

'result'が評価されるのはなぜですか? – leppie

+0

@leppie:私はあなたの質問で非常に混乱しています。代入の左辺を評価しておらず、変数から変数を生成していない場合は、右辺によって生成された値をどこに格納するのか他にどのように知っていますか? –

+0

今私も混乱しています:)私は言い換えましょう。ローカルスロット宣言(別名 'result')を評価する必要があるのはなぜですか?初期化の前に意味のある(または使用可能な)値は含まれていません(最初の割り当て)。 – leppie