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

Car*_*ras 4 c# loops while-loop

我简单地阅读C#5.0,我有以下声明:

int x = 0;

while (true)
{
    if (x++ > 5)
        break ;      // break from the loop
}
x.Dump();
Run Code Online (Sandbox Code Playgroud)

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

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

Rik*_*Rik 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);
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)


Cod*_*gue 5

x++ > 5意味着检查x反对的值5 然后增加它.这意味着break直到你才到达x == 7.

如果你使用的话++x,结果将是6 ,即增加x ,然后对5 进行测试.