在学习c#时,发现 i=i++;的结果很奇怪 ,具体代码如下:
int i=10;
i=i++;
结果竟然还是 i=10;
按理说,先赋值,再加一,结果应该是i=11;但是结果却是i=10;感觉很是费解,各位高手, 谁能帮我解释一下?谢谢!
int i=10;
i=i++;
结果竟然还是 i=10;
按理说,先赋值,再加一,结果应该是i=11;但是结果却是i=10;感觉很是费解,各位高手, 谁能帮我解释一下?谢谢!
LZ,你完全理解错了,犹如2楼说的一样,你先把 ++ 在前 和 ++ 在后 先理清 。int i=10;
i=i++;
i = 10 没错啊。
如果是这样就不一样了。
int i=10;
i=++i;
那么结果就不一样了
int i = 10;
i = i++;
cout<<i<<endl;结果:
Hello World!
11
Press any key to continue先赋值 后加1,没有问题
i=(i++)*2;你可以这样认为这段代码:int i=10;
j=i;
j=j+1;
i=i*2;首先做的是去临时复制i,而不是赋值。
int i=10;
int tmp = i;
i=i+1;
i=tmp;
2. i 自增
3. i = 刚刚取出来的值所以 i 最终还是原来的值
.method public hidebysig static void Main(string[] arg) cil managed
{
.entrypoint
// 代码大小 11 (0xb)
.maxstack 3
.locals init (int32 V_0)
IL_0000: nop
IL_0001: ldc.i4.s 10
IL_0003: stloc.0
IL_0004: ldloc.0
IL_0005: dup 栈顶元素复制了 所以说相当于第二个i 原始的i值压下去了
IL_0006: ldc.i4.1
IL_0007: add
IL_0008: stloc.0
IL_0009: stloc.0 最后弹出的是之前原始的i
IL_000a: ret
} // end of method VimeTest::Main我们改成i=++i
反汇编后就是
.method public hidebysig static void Main(string[] arg) cil managed
{
.entrypoint
// 代码大小 11 (0xb)
.maxstack 2
.locals init (int32 V_0)
IL_0000: nop
IL_0001: ldc.i4.s 10
IL_0003: stloc.0
IL_0004: ldloc.0
IL_0005: ldc.i4.1
IL_0006: add
IL_0007: dup 这里是先加后复制 所以事实上这时候两个i都是11
IL_0008: stloc.0
IL_0009: stloc.0
IL_000a: ret
} // end of method VimeTest::Main