在使用++
运算符时,我尝试编写以下内容:
++i++;
我希望首先编译它,但是我遇到了编译器错误:
增量或减量运算符的操作数必须是变量, 财产或指数。
然后我尝试编写++(i++)
来帮助编译器理解我的意思,但它(不出所料)也没有用。
所以我想知道++
运算符返回了什么?由于编译器错误,我得到{I}期望++i
不返回表示int
递增值的i
,但事实并非如此,因为我可以{{1}成功......
任何人都知道为什么i = (++i) + 1
运算符无法链接?
此外,++
确实会返回(++i).GetType()
。
答案 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;