C# 链增量算子
你为什么不能做连锁经营者C# 链增量算子,c#,operators,C#,Operators,你为什么不能做连锁经营者 int test = 5; test++++; 或 这段代码给出了一个编译时错误 递增或递减运算符的操作数必须是变量、属性或索引器 我完全理解这一点,如果允许的话,这将是一个完整的代码味道,并且几乎没有实际用途。我不完全理解为什么这会导致错误。我几乎希望test的值在每个语句之后都是7。操作符在“左手值”上工作,即可以指定的值,因为它相当于: test = test + 1; 另一方面,test++是一个表达式,您不能给它赋值,test++=5不起作用 这就是(te
int test = 5;
test++++;
或
这段代码给出了一个编译时错误
递增或递减运算符的操作数必须是变量、属性或索引器
我完全理解这一点,如果允许的话,这将是一个完整的代码味道,并且几乎没有实际用途。我不完全理解为什么这会导致错误。我几乎希望
test
的值在每个语句之后都是7。操作符在“左手值”上工作,即可以指定的值,因为它相当于:
test = test + 1;
另一方面,test++
是一个表达式,您不能给它赋值,test++=5不起作用
这就是
(test++)+
不起作用的原因。+++是一个特殊的操作符,它只是foo=foo+1的简写。当你只能说foo=foo+7时,没有必要创建一个无限的重载列表,比如+++、++++,等等,这是必须要做的
- 它本身是一个连接两个值的运算符。如果语言设计人员试图像您建议的那样将pull double duty作为一种特殊语法,那么这将给编译器带来额外的负担,并可能导致一些混乱的代码李>
int test = 1;
test+++++;
或者
int test = 1;
test += 5;
数一数这些加号会让人很痛苦。2是显而易见的。不仅如此,你还将在50比50的抽奖中数果冻豆。:-) 基本上是由于本规范第7.6.9节: 后缀递增或递减操作的操作数必须是分类为变量、属性访问或索引器访问的表达式。运算结果是与操作数类型相同的值 第二句话意味着
i++
被分类为一个值(与i
不同,不是一个变量),第一句话阻止它成为运算符的操作数
我怀疑它是为了简单而设计的,以避免你真的不想进入的奇怪情况——不仅仅是你给出的代码,还有类似的事情:
Foo(ref i++);
i++ = 10;
你的意思是说你不明白规范的哪一部分禁止它,或者为什么它是这样设计的?有没有任何语言允许这样做?@JonSkeet:为什么它是这样设计的?@JonSkeet我猜两者都有一点。在Afor循环中,我唯一能看到的唯一的用法是替换<代码> i=i+2 < />。@ Habib:是的,C++(只不过前缀版本,最大增量为一个后)。例如,我认为OP意味着像
(I++++++
)一样第二次应用++
操作符,而不是为什么语言没有++
或++
操作符。
Foo(ref i++);
i++ = 10;