重複の可能性:
C#: 関数評価の順序 (vs C)
コードスニペット:
i += ++i;
a[++i] = i;
int result = fun() - gun();
//statement of similar kind
それらの動作は C# で明確に定義されていますか? C++ では、このようなコードはundefined/unspecified behavior を呼び出します。また、返信で言語仕様の関連セクションを引用してください。
重複の可能性:
C#: 関数評価の順序 (vs C)
コードスニペット:
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;
再びテーブルから、順序は配列アクセス、事前インクリメント、代入でなければなりません-したがって、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;
最初に 'a' が評価され、次に ++i が評価され、次にインデックス演算子が実行され、次に i が評価され、次に代入が行われます。
int result = fun() - gun();
最初に結果が評価され、次に fun、次に gun、次に減算、次に代入が評価されます。
また、返信で言語仕様の関連セクションを引用してください。
あなたは完全に目次を見ることができます。見つけるのは難しくありません。