同时预增量和后增量或混合前置增量

时间:2013-01-18 17:16:21

标签: c#

  

可能重复:
  Pre and post increment/decrement operators in 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所揭示的所有细微之处here。它们都是关于行为而不是与操作数的关系,而且是CSC输出的消息。
  2. 事实上,x是不是变量?比如,在构建的++x + 1中 很好,操作数是相同的x。它同样也在运作 预增量运算符++。所以这仍然很有用 限制因编译错误而有点奇怪。不是吗 输出更有意义,比如“预增量和后增量” 运营商不能同时应用?
  3. 您是否知道任何隐藏的编译器视角原因 限制,而不是代码可用性?

3 个答案:

答案 0 :(得分:5)

(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);

答案 1 :(得分:3)

考虑一下:

foo()++;

foo()返回int的位置。 C#不会那样,因为它保护你不要做你可能不想做的事情:foo()的返回值会增加但是会被丢弃。

这就是所有这一规则:++运算符会改变一个值,因此您需要能够按名称访问结果值。所以它必须存储在一个变量中(“绑定”到一个名称)。它不能应用于没有名称的临时值。

C#编译器有一些额外的魔力可以让你在属性上使用++:

var result = obj.Prop++;

它扩展为:

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

var result = temp;

答案 2 :(得分:1)

  1. 事实上,++x++++x + 1相同吗?
  2. 不,他们不是,你可以执行后增量的预增量,而不是同时执行两者

    阅读本文:Pre and post increment/decrement operators in C#