C#中的"count++"返回什么?

18

我遇到了一些代码并没有像我想的那样运行。其他人认为这个代码应该返回1吗?有没有很好的解释为什么它没有返回1?

int count = 0;

count++.ToString(); // Returns 1 no?

我一直认为count++和count = count + 1是一样的...


1
(count++).ToString() 是什么意思? - Julius A
1
@J Angwenyi:那并没有改变任何事情。 - Austin Salonen
6个回答

46

x++ 是一个后置自增运算符。它表示 x 的值会被递增,但是返回的是旧的(未递增)值(在你的情况下是 0,然后应用了 ToString 方法)。

要获得你想要的行为,请使用前置自增运算符 ++x


1
@swingdoctor 假设 - 所有的根源... ;) - Fredrik Norlin
11
@Andrew: "那种差异必须用纳秒来衡量。如果你的程序速度如此之快,以至于几个纳秒的差别是相关的,那么你可能不想在首次使用垃圾收集语言和抢先式多任务操作系统。" - Eric Lippert
2
@Eric 速度提升确实非常小,但我认为它是使用技术所产生的预期行为的一个小加分项。除了某些特定情况外,我没有理由不使用前缀递增运算符。我主要考虑的是C/C++ :) - Andrew Marshall
7
如果你为了性能而进行某项操作,那么就应该有一个测量标准来证明代码更改对客户有实质性的显著影响。如果没有这样的测量标准,那么就应该根据除性能以外的其他标准做出实现选择。 - Eric Lippert
1
一个非性能标准是语义。后增量操作会告诉读者,“我想要对先前的值进行递增并执行某些操作。”而前增量操作只是简单地表示“我想要递增”。我经常看到在代码中需要使用前增量操作时却使用了后增量操作。这种语义上的不匹配会在阅读代码时产生一些心理摩擦。 - Ben
显示剩余6条评论

17

目前为止发布的至少四个答案是错误的。相信 ++ 运算符具有与C中相同的含糊不清的语义是一种极其常见的错误认识。实际上并不是这样。++ 运算符的语义是明确定义的,并且与这里错误回答所描述的方式有很大不同。请参阅我对上次提出这个问题的答案以获取详细信息:

i++ 和 ++i 之间有什么区别?


+1,非常有见地,像往常一样。我修改了我的答案,避免暗示这与“发生在之前”有关。 - Heinzi

8

x++ 是后增量; 当前值 (0) 用作结果,然后发生 ++。

有点像:

var tmp = count;
count++;
Consle.WriteLine(tmp);
pre-increment (++x)会按照您的预期行事。

2
(++i).ToString();

这个功能完全符合您的期望。


这是编译器的一个奇怪现象。c++.ToString() 可以编译通过,但 ++c.ToString() 却不行...!然而,隐式转换 ++c 将会生效,因此 (++c).ToString() 是可以的。真奇怪... - code4life
@code4life:这不是奇怪的现象,而是运算符绑定优先级的结果... ++c.ToString() 是试图对 ToString() 返回的字符串进行预增操作。 - Chris Dickson

1

你的原始代码将始终显示为0。

试一下这个:

(++c).ToString();

这将返回1。

来自MSDN网站

第一种形式是前缀递增操作。操作的结果是操作数在递增后的值。

第二种形式是后缀递增操作。操作的结果是操作数在递增之前的值。


最后一句话是完全错误的。无论++的位置在哪里,增量始终发生在调用ToString()之前。如果你不相信我,试试这个:static class X { public static void M(this int x) { Console.WriteLine(C.c); } } class C { int public static int c = 0; static void Main() { (C.c++).M(); } } 正如你所看到的,C.c的增量发生在调用之前,而不是在执行该行之后。C#保证副作用按从左到右的顺序发生。 - Eric Lippert
请参阅https://dev59.com/tXA75IYBdhLWcg3wVniI#3346729了解更多详情。 - Eric Lippert

-2
不是的,++count 返回 "1"。count++.ToString() 执行 ToString() 方法然后增加 count,所以它返回 "0"。

第二句话是错误的。请参考https://dev59.com/tXA75IYBdhLWcg3wVniI#3346729了解原因。 - Eric Lippert
看了你的评论,我有一个疑问,然后我写了这个。它证实了我的想法:public static void Main() { int cpt = 0;Console.WriteLine(cpt++.ToString()); cpt = 0; Console.WriteLine((++cpt).ToString()); Console.ReadLine();} - Sebastien
嗯...我的大脑有点卡了...我没听懂你说的执行流程。我应该写成“ToString()方法在未递增的值上执行”。 - Sebastien

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接