关于单句i++与++i的区别
先写段试例代码,分别通过反汇编查看两者的代码有什么不同
- private void Form1_Load(object sender, EventArgs e)
- {
- // 后置++
- int i = 0;
- i++;
- Console.WriteLine(i);
- }
复制代码 运行程序后通过VS的反汇编窗口查看代码
关键部份代码- 00000032 xor edx,edx
- 00000034 mov dword ptr [ebp-44h],edx
- 00000037 nop
- int i = 0;
- 00000038 xor edx,edx
- 0000003a mov dword ptr [ebp-44h],edx
- i++;
- 0000003d inc dword ptr [ebp-44h]
- Console.WriteLine(i);
- 00000040 mov ecx,dword ptr [ebp-44h]
- 00000043 call 75F727E4
- 00000048 nop
复制代码 再写段前置++的代码
- private void Form1_Load(object sender, EventArgs e)
- {
- // 前置++
- int i = 0;
- ++i;
- Console.WriteLine(i);
- }
复制代码 反汇编后的代码
- 00000032 xor edx,edx
- 00000034 mov dword ptr [ebp-44h],edx
- 00000037 nop
- int i = 0;
- 00000038 xor edx,edx
- 0000003a mov dword ptr [ebp-44h],edx
- ++i;
- 0000003d inc dword ptr [ebp-44h]
- Console.WriteLine(i);
- 00000040 mov ecx,dword ptr [ebp-44h]
- 00000043 call 75F727E4
- 00000048 nop
复制代码 由此可见,在i++和++i后汇编代码后都进行了一次inc的加一操作,所以两者效果是一样的。
--------------------------------------------------------------------------------------------------------------------------------
再看如果不是单句进行++,而是对变量进行一些计算,会有什么区别。
再写段简单的示例代码
后置++的代码
- private void Form1_Load(object sender, EventArgs e)
- {
- int i = 0;
- int j = 0;
- j = 1 + i++; // 先进行运算再加一,J的结果是1,I的结果也是1
- Console.WriteLine("i:" + i + " j:" + j);
- }
复制代码 反汇编代码,关键部份
- 00000041 nop
- int i = 0;
- 00000042 xor edx,edx
- 00000044 mov dword ptr [ebp-44h],edx
- int j = 0;
- 00000047 xor edx,edx
- 00000049 mov dword ptr [ebp-48h],edx
- j = 1 + i++; // 先进行运算再加一,J的结果是1,I的结果也是1
- 0000004c mov eax,dword ptr [ebp-44h]
- 0000004f mov dword ptr [ebp-50h],eax
- 00000052 inc dword ptr [ebp-44h]
- 00000055 mov eax,dword ptr [ebp-50h]
- 00000058 inc eax
- 00000059 mov dword ptr [ebp-48h],eax
- Console.WriteLine("i:" + i + " j:" + j);
复制代码 再写段前置++的代码
- private void Form1_Load(object sender, EventArgs e)
- {
- int i = 0;
- int j = 0;
- j = 1 + ++i; // i先加一然后再进行运算,J的结果是2,I的结果也是1
- Console.WriteLine("i:" + i + " j:" + j);
- }
复制代码 查看反汇编代码
- 00000041 nop
- int i = 0;
- 00000042 xor edx,edx
- 00000044 mov dword ptr [ebp-44h],edx
- int j = 0;
- 00000047 xor edx,edx
- 00000049 mov dword ptr [ebp-48h],edx
- j = 1 + ++i; // i先加一然后再进行运算,J的结果是2,I的结果也是1
- 0000004c inc dword ptr [ebp-44h]
- 0000004f mov eax,dword ptr [ebp-44h]
- 00000052 inc eax
- 00000053 mov dword ptr [ebp-48h],eax
- Console.WriteLine("i:" + i + " j:" + j);
复制代码 由此可见,j = 1 + i++这条语句的反汇编代码比j = 1 + ++i这条语句的反汇编代码多了两条汇编语句:
0000004c mov eax,dword ptr [ebp-44h]
0000004f mov dword ptr [ebp-50h],eax
i++比++i多了两条赋值语句,因为i++是先进行运算然后再自增,而++i是自增后再进行运算,i++由于要保留原值进行运算,所以i把原值赋给了[ebp-50h]这个地址指向的值
|