考虑以下简单代码段:
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.
很明显,在同一语句中混合前/后递增或递减对于编译器来说不是一个理想的特性。
但是
++x++
与++x + 1
不一样吗?甚至考虑到Eric Lippert所揭示的所有细微之处here。它们都是关于行为而不是与操作数的关系,而且是CSC输出的消息。x
是不是变量?比如,在构建的++x + 1
中
很好,操作数是相同的x
。它同样也在运作
预增量运算符++。所以这仍然很有用
限制因编译错误而有点奇怪。不是吗
输出更有意义,比如“预增量和后增量”
运营商不能同时应用?答案 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)
++x++
与++x + 1
相同吗?不,他们不是,你可以执行后增量的预增量,而不是同时执行两者