简而言之,C#误解了++一元运算符增量

时间:2014-01-07 13:30:01

标签: c# loops while-loop

我正在阅读C#5.0,我有以下声明:

int x = 0;

while (true)
{
    if (x++ > 5)
        break ;      // break from the loop
}
x.Dump();

在LINQPad 4上执行语句,输出 7

我还是不明白为什么?为什么它不是条件:x ++> 5

9 个答案:

答案 0 :(得分:7)

++运算符递增值并返回原始值

因此,当x为5时,x会增加,并会评估条件5 > 5

然后,当x为6时,x会增加并评估条件6 > 5,从而产生break。由于x仍然增加,最后x的值为7。

人们经常说当++运算符用作后缀时,增量会在比较后执行,但这在技术上并不正确,这可以通过LinqPad中的反编译来显示:

int x = 5;
if (x++ > 5) 
Console.WriteLine(x);

IL:

IL_0001:  ldc.i4.5    
IL_0002:  stloc.0     // x
IL_0003:  ldloc.0     // x
IL_0004:  dup         
IL_0005:  ldc.i4.1    
IL_0006:  add         // <---- Increment
IL_0007:  stloc.0     // x <-- Result of increment is popped from the stack and stored in a variable
IL_0008:  ldc.i4.5    
IL_0009:  cgt         // <---- Comparison
IL_000B:  ldc.i4.0    
IL_000C:  ceq         
IL_000E:  stloc.1     // CS$4$0000
IL_000F:  ldloc.1     // CS$4$0000
IL_0010:  brtrue.s    IL_0019
IL_0012:  ldloc.0     // x
IL_0013:  call        System.Console.WriteLine

答案 1 :(得分:5)

x++ > 5表示检查x5 的值,然后增加它。这意味着在break之前未达到x == 7

如果您使用++x,结果将为6,即递增x 然后将其与5进行测试。

答案 2 :(得分:4)

以下是循环的迭代:

  • x == 0 - &gt;比较返回false - &gt; x已增加到1
  • x == 1 - &gt;比较返回false - &gt; x已增加到2
  • x == 2 - &gt;比较返回false - &gt; x已增加到3
  • x == 3 - &gt;比较返回false - &gt; x已增加到4
  • x == 4 - &gt;比较返回false - &gt; x已增加到5
  • x == 5 - &gt;比较返回false - &gt; x已增加到6
  • x == 6 - &gt;比较返回true - &gt; x增加到7 - &gt; if - 输入阻止并保留循环

将输出x的最后一个值,即7

请注意x++操作会在评估比较x后修改x > 5的值,但无论是否为是否输入比较trueif - 块。

答案 3 :(得分:4)

在C#上,++一元运算符在其操作数(可以是++ x或x ++)之后写入时,在表达式中的评估之后执行。这意味着:

  • 当x为5时,表达式将被评估为false(5不大于5)然后将其递增为6.
  • 然后,当x为6时,表达式将被评估为真是(6>> 5),但是然后它将再次递增,当x 时断开7 即可。

答案 4 :(得分:3)

原因是x++将在检查后进行评估。因此,当它最终到达x == 6条件时(6 > 5)然后 它将会增加(到7

使用一些替代代码更容易解​​释,这将产生相同的结果:

while (true)
{
    if(x > 5)
    {
        //x = 6
        x++;
        //x = 7
        break;
    }
    x++;//x increments from 0 - 6, over 6 loops
}

答案 5 :(得分:2)

你在增加它之前评估x,所以6的条件会导致中断,然后它会上升1到7.我认为你期待这个:

int x = 0;

while (true)
{
    if (++x > 5)
        break ;      // break from the loop
}
x.Dump();

在评估条件之前,这将增加x。

答案 6 :(得分:1)

这是因为++

++运算符每次到达该行时都会计算x。 当你有一个while(true)循环时,每当它到达if语句时,它将在if语句中计算x一。

答案 7 :(得分:0)

当然,它是7,因为即使它检查6&gt; 5,它递增1。由于一元运算符x++

答案 8 :(得分:0)

x ++在读取值后递增x。这意味着在比较失败后增加一次。 另一方面,++ x在读取值之前递增。