コードスニペット:
i += ++i;
a[++i] = i;
int result = fun() - gun();
//statement of similar kind
は、彼らの行動は、C#で明確に定義されていますか? C++では、このようなコードは
undefined/unspecified behaviorを呼び出します。また、あなたの回答の言語仕様から関連するセクションを引用してください!
コードスニペット:
i += ++i;
a[++i] = i;
int result = fun() - gun();
//statement of similar kind
は、彼らの行動は、C#で明確に定義されていますか? C++では、このようなコードは
undefined/unspecified behaviorを呼び出します。また、あなたの回答の言語仕様から関連するセクションを引用してください!
ここでのキーは、「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()
、-
の割り当てが必要です。
人々はこれを常に混乱させます。これはC#では非常に簡単なので不幸です。ルールは、次のとおり
部分式は、を評価することが観察された実行中のスレッド、期間から観察したとき、右に物語の左端。 (評価の順序は、他のスレッドが副作用を見ている場合には、他のスレッドによって異なることが認められています。)
オペレータの実行順序は、その優先順位と結合性によって決まります。
これらは、関連する唯一の2つのルールであり、与えたコードの動作を完全に定義します。
i += ++i;
に最初のiは、iが評価され、その後++、評価され、その後、+ =が実行されます。
a[++i] = i;
最初に評価される「」、その後、++ iは、私が評価され、インデックスオペレータが実行され、その後、評価され、その後、割り当てが行われます。
int result = fun() - gun();
最初の結果が評価され、次に楽しく、次にガンが減算され、次に割り当てられます。
応答の言語仕様の関連セクションも引用してください。
あなたは完全に目次を見ることができます。見つけにくいです。
[C#:関数評価の順序(vs C)](http://stackoverflow.com/questions/1215236/c-order-of-function-evaluation)では、さまざまな人々から回答が得られません。 -vs-c)? – Gabe
@ Gabe:私の質問の最初の2つのステートメントは、他のトピックで説明したステートメントと少し異なります。私は間違っているかもしれません。 – Nawaz
@All:このトピックを閉じるために投票しないでください。私の質問の最初の2つの文に何らかの答えがあっても害はありません。 – Nawaz