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吗?即使考虑到 Eric Lippert在这里发现的所有微妙之处。它们都是关于行为而不是与操作数的关系,以及 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()++;

wherefoo()返回一个 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 回答