Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
什么是;计数++&引用;以C#返回?_C# - Fatal编程技术网

什么是;计数++&引用;以C#返回?

什么是;计数++&引用;以C#返回?,c#,C#,只是遇到了一点代码,它没有做我认为应该做的事情。其他人认为应该返回1吗?有没有一个很好的解释来解释为什么它没有 int count = 0; count++.ToString(); // Returns 1 no? 我一直认为count++与count=count+1相同…x++是一个后增量运算符。这意味着x的值是递增的,但x的旧(非递增)值是返回的(在您的案例中为0,应用了ToString) 要获得所需的行为,请使用预增量运算符++x (++i).ToString(); 做你期望的事情。

只是遇到了一点代码,它没有做我认为应该做的事情。其他人认为应该返回1吗?有没有一个很好的解释来解释为什么它没有

int count = 0;

count++.ToString(); // Returns 1 no?
我一直认为count++与count=count+1相同…

x++
是一个后增量运算符。这意味着
x
的值是递增的,但
x
的旧(非递增)值是返回的(在您的案例中为0,应用了
ToString

要获得所需的行为,请使用预增量运算符
++x

(++i).ToString();

做你期望的事情。

x++是增量后的;使用当前值(0)作为结果,然后执行++操作

有点像:

var tmp = count;
count++;
Consle.WriteLine(tmp);

预增量(++x)将按照您的预期运行。

您的原始代码将始终显示0

试试这个:

(++c).ToString();
这将返回1

:

第一种形式是前缀增量 活动手术结果 后面的操作数的值 已递增

第二种形式是后缀增量 活动手术结果 前一个操作数的值 已递增


否,++计数返回“1”。count++.ToString()执行ToString()方法,然后递增count,因此它返回“0”。

到目前为止发布的答案中至少有四个是错误的。认为++运算符具有与C中相同的定义不正确的语义是极为常见的错误。它没有。++运算符的语义定义良好,与此处错误答案所描述的语义截然不同。有关详细信息,请参见我上次对该问题的回答:


那(count++)呢。ToString()呢?@J Angwenyi:这不会改变任何事情。这是编译器的一个奇怪之处。C++,toStReg()编译,但是++c. toStrug()不…但是,隐式转换++c将起作用,因此(++c).ToString()。奇怪…@code4life:这不是奇怪的,只是运算符绑定优先级的结果
++c.ToString()
是一种试图预先递增由
ToString()
@swingdoctor-Associations-所有…;)返回的字符串的尝试<在某些语言中,code>++x也可能比
x++
快(因为原始值必须单独复制和存储才能随后期增量返回)。总的来说,我认为始终使用增量前操作符是个好主意,因为当差异重要时,增量后操作符很少有预期的结果。@安德鲁:这种差异必须以纳秒为单位来测量。如果你的程序速度如此之快,以至于只有几纳秒的差异是相关的,那么你可能首先不想在抢占式多任务操作系统上使用垃圾收集语言。@Eric加速比当然非常小,我只是认为这对使用导致(至少我认为)是预期的行为。我看不出有任何理由不在特定情况之外使用pre-increment运算符。我主要考虑的是C/C++:)@琼:我认为,如果你是出于性能原因而做某件事,那么应该有一个衡量标准来证明代码更改对客户来说意义重大。如果没有这样的衡量标准,那么就根据绩效以外的标准做出实施选择。最后一句话是绝对错误的。无论++的位置如何,增量总是在调用ToString()之前发生。如果你不相信我,试试看:静态类X{public static void M(this int X){Console.WriteLine(C.C);}}类C{int public static int C=0;静态void Main(){(C.C++.M();}}正如你所看到的,C.C的增量发生在调用之前,而不是在执行行之后。C#保证副作用按从左到右的顺序发生。有关详细信息,请参阅。第二句是错误的。看看原因。读了你的评论,我有一个疑问,然后我写了这个。它确认了我没有错:public static void Main(){int cpt=0;Console.WriteLine(cpt++.ToString());cpt=0;Console.WriteLine((++cpt.ToString());Console.ReadLine();}Hm。。。我的大脑迟钝了。。。我不明白你说的执行流程。我已经写了“ToString()方法是在非递增值上执行的”,谢谢你的澄清,Eric.+1,和往常一样,非常有洞察力。我修改了我的答案,以避免暗示这与“以前发生过”有关。