我简而言之读C#5.0和我有以下语句:C#简而言之示例误解++一元运算符增量
int x = 0;
while (true)
{
if (x++ > 5)
break ; // break from the loop
}
x.Dump();
执行输出为上LINQPad 4的语句。
我还是不明白为什么?为什么它不是6是所述条件:X ++> 5个
我简而言之读C#5.0和我有以下语句:C#简而言之示例误解++一元运算符增量
int x = 0;
while (true)
{
if (x++ > 5)
break ; // break from the loop
}
x.Dump();
执行输出为上LINQPad 4的语句。
我还是不明白为什么?为什么它不是6是所述条件:X ++> 5个
的++
操作者递增值,并返回原始值。
因此,当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
我想找到一些关于循环的文档和增量后返回的原始值。你能告诉我一些链接吗?我找不到它 –
请参阅http://msdn.microsoft.com/en-us/library/36x43w8w.aspx – Rik
太好了。谢谢 !。接受的答案 –
x++ > 5
装置核对5
然后增量它的x
值。这意味着您的break
直到x == 7
才被触及。
其结果将是6如果使用++x
,即增量X 然后测试针对5.
很好的解释。谢谢。从来没有用过de x ++ –
虽然实际上是相同的,并且经常用这种方式解释,但这并不完全准确。增量在*比较之前执行*,但递增操作的返回值是*原始值*。 – Rik
@Rik技术上是正确的(最好的一种正确的!),但在理解语句方面,这使得它更容易 – CodingIntrigue
当然,它是7,因为即使当它检查6> 5时,它也会增加1。由于一元运算符x++
。
好的,为什么投下来呢? –
以下是循环迭代:
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
- 阻塞不管。
你正在评估X您增加它之前,这样你的6情况将导致休息,然后上升1到7,我认为你期待这样的:
int x = 0;
while (true)
{
if (++x > 5)
break ; // break from the loop
}
x.Dump();
这将增加x评估其状况之前。
x读取值后x增加x。这意味着在比较失败后它增加一次。 ++ x在读取值之前递增。
这个答案是无意义的;在读取*之前,变量如何增加*?在这里,我有一个变量x。我希望你给这个变量赋值x + 1,但是在你做之前你不允许读取x的值。你会怎么做? –
语义上它对我来说很合理。在递增之前,该值不会在语法上被读取评估。在代码本质上将变成的机器代码中,实际上可能增加内存位置而不将其加载到寄存器中。 – Holstebroe
这是因为++
的++
操作数X它击中线一次上来每次。 而当你有一个while(true)
循环时,它会在if语句每次达到if语句时计数一个。
在C#上,++一元运算符在其操作数(它可以是++ x或x ++)后面写时,会在表达式中对进行求值后执行。这意味着:
很好的解释 –
虽然实际上是相同的,并经常用这种方式解释,但这并不完全准确。增量在比较之前执行,但增量操作的返回值是原始值。 – Rik
看看x ++用x做什么,x ++与++ x不一样。如果它是++ x而不是x ++,它将与x = 6分开。 – esrange
如果我错了,请打我,但我认为它是前表达式。 ++在'> 5'之后被评估。 –
我会建议不要编写这样的代码 - 在我看来这是糟糕的partice。只是写清楚和容易'if(x> = 7)' – WhileTrueSleep