C# 将增量后/增量前运算符限制在值上,而不是变量、属性和索引器上

C# 将增量后/增量前运算符限制在值上,而不是变量、属性和索引器上,c#,C#,从post(而不仅仅是post)中,我们得出了这样一个结论:++运算符不能应用于返回值的表达式。 很明显,5++编写为5+1更好。我只想总结一下增量/减量运算符的全部内容。所以,让我们来看一下这些代码片段,它们至少对第一次使用++的人有帮助 // Literal int x = 0++; // Error // Constant const int Y = 1; double f = Y++; // error. makes sense, constants are not variables

从post(而不仅仅是post)中,我们得出了这样一个结论:++运算符不能应用于返回值的表达式。 很明显,5++编写为5+1更好。我只想总结一下增量/减量运算符的全部内容。所以,让我们来看一下这些代码片段,它们至少对第一次使用++的人有帮助

// Literal
int x = 0++; // Error

// Constant
const int Y = 1;
double f = Y++; // error. makes sense, constants are not variables actually.

int z = AddFoo()++; // Error
概要:++适用于变量、属性(通过合成糖)和索引器(相同)。
现在,兴趣部分-任何文字表达式都在CSC中进行了优化,因此,当我们编写时

int g = 5 + 1; // This is compiled to 6 in IL as one could expect.
IL_0001: ldc.i4.6 // Pushes the integer value of 6 onto the evaluation stack as an int32.
因为5++并不意味着5变成6,它可以是5+1的简写,就像x++=x+1一样 这一限制背后的真正原因是什么

int p = Foo()++ //? yes you increase the return value of Foo() with 1, what's wrong with that?
我们欣赏可能导致逻辑问题的代码示例

现实生活中的一个例子是,执行比数组中多一个操作

for (int i = 0; i < GetCount()++; i++) { }
for(inti=0;i
也许由于使用率的缺乏,编译器团队会避免使用类似的功能? 我并不坚持这是我们所缺乏的特性,只是想让编译器编写人员了解这一特性的阴暗面,尽管我不是。但我知道。我不是一个C++的家伙(很差的知识)只是想得到真正的限制要点。
比如,这仅仅是因为c#guys选择限制++过值表达式,还是因为某些特定情况会导致不可预测的结果?

为了让某个功能值得支持,它确实需要有用。您所展示的代码在任何情况下都不如另一种方法可读,即只使用普通的二进制加法运算符。例如:

for (int i = 0; i < GetCount() + 1; i++) { }
for(inti=0;i

我完全支持语言团队防止您编写不可读的代码,因为在任何情况下,只要您能够做到,都有一个更简单的替代方法。

在使用这些运算符之前,您应该尝试详细了解它们是如何做的。特别是,您应该了解后缀和前缀之间的区别,这有助于了解什么是允许的,什么是不允许的

++和--运算符修改其操作数。这意味着操作数必须是可修改的。如果可以为所讨论的表达式指定一个值,那么它是可修改的,并且可能是一个变量(c#)

看看这些运营商到底在做什么。后缀运算符应该在代码行执行后递增。至于前缀运算符,它们需要在调用方法之前访问该值。我读取语法的方式是将
++lvalue(或++变量)
转换为
内存操作:[读、写、读]
lvalue++
,尽管许多编译器可能会优化二次读取

看看
foo()++该值将在执行代码的中心死掉。这意味着编译器需要将该值保存在更长期的某个位置,以便在代码行完成执行后对该值执行操作。这无疑是C++不支持这个语法的确切原因。

如果您要返回一个引用,编译器将不会有任何后缀问题。当然,在C#中,值类型(即int、char、float等)不能通过引用传递,因为它们是类型。

Jon,这确实是一个很好的特征选择点。那么(i++vs i++=1),您是否认为选择+++/-运算符作为C#的语言特性主要是为了向C/C++世界的历史致敬(例如getcount()++)是一种可能的情况?比如说,如果你今天发明了一种全新的语言,你会像现在的C一样为变量添加这个操作符吗?@Arman:我可能仍然会包括
I++
++I
,是的。它们足够方便和有用,值得包含,但我不想包含
get\u count()++
。我只是觉得这不是一件好事。Jon,“可能”-有点怀疑:)好吧,我对这个功能很满意,因为大多数开发人员,只是想知道语言/编译器专业人士的意见。相比之下,C语言有一个很好的特性,比如x,它可以将浮点数增加一半,就像在乐谱中半音一样:)。谢谢你的回复。