3

重複の可能性:
C#のインクリメント/デクリメント演算子の前後

次の簡単なスニペットについて考えてみます。

int x = 0;
int y = ++x + 1; // forks fine, gives y 2 (no doubt :) )

int x = 0;
int y = ++x++; // Error: The operand of an increment or decrement operator must be a variable, property or indexer.

同じステートメントで前後の増分または減分を混合することは、コンパイラーにとって望ましい機能ではないことは明らかです。

だが

  1. 実際、++x++と同じではありません++x + 1か?エリック・リッパートがここで明らかにするすべての微妙な点を考慮に入れても。これらはすべて、オペランドとの関係ではなく、CSCが出力するメッセージの動作に関するものです。
  2. 実際、x変数ではありませんか?同様に、++x + 1それはうまく構築され、オペランドは同じxです。また、プリインクリメント演算子++でも同様に動作します。したがって、これはまだ有用な制限であり、コンパイラエラーで少し奇妙に思えます。たとえば、「プリインクリメント演算子とポストインクリメント演算子を同時に適用することはできません」と出力する方が意味がありませんか。
  3. そして、コードの使いやすさではなく、この制限の隠れたコンパイラーの観点を知っていますか?
4

3 に答える 3

6

(x ++)または(++ x)の結果は、実際には変数ではありません。これは値なので、次のようになります。

int y = (++x) + 1;
// evaluates to
int y = (1) + 1;

しかし

int y = ++x++;
// is equivalent to 
int y = ++(x++);
// evaluates to
int y = ++(0);
于 2013-01-18T17:24:55.560 に答える
3

このことを考慮:

foo()++;

どこfoo()でintを返します。C# はそれを好まないでしょう。なぜなら、おそらく意図していないことを実行することから保護されているからです: の戻り値はfoo()インクリメントされますが、その後破棄されます。

これがこのルールのすべてです。++演算子は値を変更するため、結果の値に名前でアクセスできる必要があります。そのため、変数に格納する必要があります (名前に「バインド」)。名前のない一時的な値には適用できません。

C# コンパイラには、プロパティで ++ を使用できる特別な魔法があります。

var result = obj.Prop++;

それは次のように展開されます:

var v = obj.Prop;
var temp = v++;
obj.Prop = v;

var result = temp;
于 2013-01-18T17:19:41.330 に答える
1
  1. 実際、++x++と同じではありません++x + 1か?

いいえ、そうではありません。プリインクリメントとポストインクリメントのどちらかを実行できますが、両方を同時に実行することはできません

これを読んでください:C#の前後のインクリメント/デクリメント演算子

于 2013-01-18T17:18:31.600 に答える