2014-07-23 29 views
27

虽然与++运营商玩弄,我试着写:++(或 - )运算符返回什么?

++i++; 

我预计在第一编译,但我得到一个编译器错误:

The operand of an increment or decrement operator must be a variable, property or indexer.

然后我试着写++(i++)以帮助编译器理解我的意思,但它也(不出所料)不起作用。

所以我想知道++运算符返回什么?随着编译器错误我得到我期待++i有来无回代表i增加值的int,但也并非如此,因为我可以做i = (++i) + 1成功...

任何人有任何想法,为什么++运营商不能链接?

另外,(++i).GetType()的确返回System.Int32

+0

你应该看看C++运算符重载说不定就会搞清楚http://stackoverflow.com/questions/4421706/operator-overloading –

+0

只是好奇,确实(++我)++编译?我没有VS在我面前,所以我无法检查。 – RLH

+0

不,它不。因为'++ i'返回的值是递增的,而不是变量本身。 (从我刚刚学到的:P) – Bun

回答

45

在C#++ operator之前(对于i++)或之后(对于++i)递增返回

您所看到的错误是因为该操作员只能在变量,属性或索引器上使用。 原因是因为运营商的意图是增加被引用的变量。你不能在表达式或其他类型上使用它。 (9++)会怎么做?

您希望(i++)++等于i++; i++。但i++返回和内部增量i。由于您无法将++运算符应用于链接是不可能的。

在C++所不同的是所述++ 前缀操作者需要参考作为输入,并返回一个参考到原来的值,所以可以链,因为它操作员只是使用指针代替的价值。 后缀运算符返回一个值,因此不能链接。

+0

关于C#/ C++比较的部分非常有趣(不是其余答案不是),也可能是我误解的根源。非常感谢。 – Bun

+0

@Bun很高兴帮助。 –

+3

此内容同时涵盖此内容[Eric Lippert](http://stackoverflow.com/a/3346729/60761) –

17

++--运算符的结果是变量,属性或索引的,和变量,属性或索引本身。

您不能像(i++)++那样对变量进行双重增量,因为您无法像100++那样自行增加值。

+0

哇,我不敢相信我没有想到这一点。非常感谢您的明确解释。 – Bun

4

如果我可以从C或C++中借用术语,++运算符在这里返回一个“r值”。一个r值不映射到一种语言类型,这是一个区分可分配(可修改)和不可以分配的语法技巧。

可以在赋值操作的左侧找到的东西称为l值(左值),而在赋值右侧可以找到的东西是“r值”(右值)。 ++运算符必须在l值上运行,因为它需要分配给它。但是,返回的表达式是一个r值,因为它没有意义在C#做i++ = 4,就像它没有道理做foo.Bar() = 41 = 5

C#没有左值右值或本身,但它限制了可以在一个赋值给变量,属性和索引操作的左侧找到。这并非巧合,也可以使用++运算符。

+1

很好的答案。我注意到你说C#没有​​使用有些令人困惑的“右值”/“左值”术语是正确的。相反,C#将所有表达式分类为:*值,变量,名称空间,类型,方法组,空字面,匿名函数,属性,索引器,事件和无返回方法调用*。 (数组初始值设定项虽然看起来像表达式,但在技术上不是表达式。) –

1

我意识到你不能在表达式之前或之后使用++

当你使用:

++(i++); 

你正在做的事情,如:

++(<expression>) 

编译器首先解析表达式,然后将增加的表达和声音疯狂的结果。操作数++通过递增立即变量no来表达结果。

如何评估编程表达式?语言(BNF)的语法http://people.cis.ksu.edu/~schmidt/301s11/Lectures/bnfT.html

这里的正确使用这种操作++

int i = 0, j = 0; 
int sum = i++ + j++; 
//result sum = 0, i = 1, j = 1 

此操作++是凌乱的,因为做3件事一次(读,增量,分配的另一个例子)。我个人不使用大型表达式,例如上面的例子:i++ + j++。但我仍然在for循环或while循环中使用它。

即使是一个短的表达,如i = j++;是一团糟。 保持您的代码简单易懂。同样的表达,可以这样写:

i = j; 
j++; //or j+=1;