2014-01-07 36 views
4

我简而言之读C#5.0和我有以下语句:C#简而言之示例误解++一元运算符增量

int x = 0; 

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

执行输出为上LINQPad 4的语句。

我还是不明白为什么?为什么它不是6是所述条件:X ++> 5个

+1

看看x ++用x做什么,x ++与++ x不一样。如果它是++ x而不是x ++,它将与x = 6分开。 – esrange

+3

如果我错了,请打我,但我认为它是前表达式。 ++在'> 5'之后被评估。 –

+1

我会建议不要编写这样的代码 - 在我看来这是糟糕的partice。只是写清楚和容易'if(x> = 7)' – WhileTrueSleep

回答

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 
+0

我想找到一些关于循环的文档和增量后返回的原始值。你能告诉我一些链接吗?我找不到它 –

+0

请参阅http://msdn.microsoft.com/en-us/library/36x43w8w.aspx – Rik

+0

太好了。谢谢 !。接受的答案 –

5

x++ > 5装置核对5然后增量它的x值。这意味着您的break直到x == 7才被触及。

其结果将是6如果使用++x,即增量X 然后测试针对5.

+0

很好的解释。谢谢。从来没有用过de x ++ –

+0

虽然实际上是相同的,并且经常用这种方式解释,但这并不完全准确。增量在*比较之前执行*,但递增操作的返回值是*原始值*。 – Rik

+1

@Rik技术上是正确的(最好的一种正确的!),但在理解语句方面,这使得它更容易 – CodingIntrigue

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 
} 
+0

尽管实际上是相同的,并且通常用这种方式解释,但这并不完全准确。增量在比较之前执行,但增量操作的返回值是原始值。 – Rik

+0

@Rik ...是的,我看到您的评论来了;-) – musefan

0

当然,它是7,因为即使当它检查6> 5时,它也会增加1。由于一元运算符x++

+1

好的,为什么投下来呢? –

4

以下是循环迭代:

  • x == 0 - >比较返回false - >x增加到1
  • x == 1 - >比较返回false - >x增加到2
  • x == 2 - >比较返回false - >x增加到3
  • x == 3 - >比较返回false - >x增加到4
  • x == 4 - >比较返回false - >x增加到5
  • x == 5 - >比较返回false - >x增加到6
  • x == 6 - >比较返回true - >x增加到7 - >if - 块被输入并且th e循环剩余

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

注意,x++操作修改的x值,比较x > 5后评估,但的比较是否返回true并进入if - 阻塞不管

2

你正在评估X您增加它之前,这样你的6情况将导致休息,然后上升1到7,我认为你期待这样的:

int x = 0; 

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

这将增加x评估其状况之前。

0

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

+1

这个答案是无意义的;在读取*之前,变量如何增加*?在这里,我有一个变量x。我希望你给这个变量赋值x + 1,但是在你做之前你不允许读取x的值。你会怎么做? –

+0

语义上它对我来说很合理。在递增之前,该值不会在语法上被读取评估。在代码本质上将变成的机器代码中,实际上可能增加内存位置而不将其加载到寄存器中。 – Holstebroe

1

这是因为++

++操作数X它击中线一次上来每次。 而当你有一个while(true)循环时,它会在if语句每次达到if语句时计数一个。

4

在C#上,++一元运算符在其操作数(它可以是++ x或x ++)后面写时,会在表达式中对进行求值后执行。这意味着:

  • 当x为5时,表达式将被评估为false(5不大于5),然后将其增加到6。
  • 然后,当x是6时,表达式将被评估为是(6>> 5),但是然后它将再次增加,当x是时中断。
+0

很好的解释 –

+0

虽然实际上是相同的,并经常用这种方式解释,但这并不完全准确。增量在比较之前执行,但增量操作的返回值是原始值。 – Rik