++(或 - )运算符返回什么?

时间:2014-07-23 18:27:37

标签: c# operators

在使用++运算符时,我尝试编写以下内容:

++i++;

我希望首先编译它,但是我遇到了编译器错误:

  

增量或减量运算符的操作数必须是变量,   财产或指数。

然后我尝试编写++(i++)来帮助编译器理解我的意思,但它(不出所料)也没有用。

所以我想知道++运算符返回了什么?由于编译器错误,我得到{I}期望++i不返回表示int递增值的i,但事实并非如此,因为我可以{{1}成功......

任何人都知道为什么i = (++i) + 1运算符无法链接?

此外,++确实会返回(++i).GetType()

4 个答案:

答案 0 :(得分:45)

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

您看到的错误是因为该运算符只能用于变量,属性或索引器原因是因为运算符的意图是增加正在引用的变量。您不能在表达式或其他类型上使用它。 (9++)会做什么?

您希望(i++)++等同于i++; i++。但i++会返回并在内部递增i。由于您无法将++运算符应用于,因此无法进行链接。

C ++的不同之处在于++ 前缀运算符将引用作为输入,并将引用返回到原始值,所以你可以链接操作符,因为它只是使用指针而不是值。 postfix 运算符返回一个值,因此无法链接。

答案 1 :(得分:17)

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

您不能对(i++)++之类的变量进行双倍增量,原因与100++一样,您可以自行增加值。

答案 2 :(得分:4)

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

你可以在赋值操作的左侧找到的东西称为l值(左值),你可以在赋值右侧找到的东西是“r值”(右值) 。 ++运算符必须对l值进行操作,因为它需要赋值给它。但是,返回的表达式必须是r值,因为在C#中执行i++ = 4没有意义,就像执行foo.Bar() = 4或{{1}没有意义一样}。

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

答案 3 :(得分:1)

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

使用时:

++(i++);
你正在做类似的事情:

++(<expression>)

编译器首先解析表达式,然后它会增加表达式的结果,这听起来很疯狂。操作数++通过递增立即变量而不是表达式的结果来工作。

如何评估编程表达式?语言语法(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;