我正在阅读C#5.0,我有以下声明:
int x = 0;
while (true)
{
if (x++ > 5)
break ; // break from the loop
}
x.Dump();
在LINQPad 4上执行语句,输出 7 。
我还是不明白为什么?为什么它不是条件:x ++> 5
答案 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
表示检查x
对5
的值,然后增加它。这意味着在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
,的值,但无论是否为是否输入比较true
和if
- 块。
答案 3 :(得分:4)
在C#上,++一元运算符在其操作数(可以是++ x或x ++)之后写入时,在表达式中的评估之后执行。这意味着:
答案 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在读取值之前递增。