|
发表于 2013-6-16 10:58:00
|
显示全部楼层
想必这个 i++ 和 ++ i 的区别大家都知道
i++ : 就是先 赋值给表达式 i => i++
然后再 自身加 1 , i = i+1
++i : 就是相反的 就是先自身加 1,然后再给表达式赋值。
你说的第五条 原因是 编译器在 将参数压栈前做了处理,压栈顺序是 从右往左:
也就是说 编译器先从优往左 把那几个表达式计算了变,然后再把值输出的:
这个 VS2008的汇编;- printf("%d,%d,%d,%d\n",i++,i--,++i,--i);
- 012B146D mov eax,dword ptr [i]
- 012B1470 sub eax,1
- 012B1473 mov dword ptr [i],eax
- 012B1476 mov ecx,dword ptr [i]
- 012B1479 add ecx,1
- 012B147C mov dword ptr [i],ecx
- 012B147F mov edx,dword ptr [i]
- 012B1482 mov dword ptr [ebp-0D0h],edx
- 012B1488 mov eax,dword ptr [i]
- 012B148B sub eax,1
- 012B148E mov dword ptr [i],eax
- 012B1491 mov ecx,dword ptr [i]
- 012B1494 mov dword ptr [ebp-0D4h],ecx
- 012B149A mov edx,dword ptr [i]
- 012B149D add edx,1
- 012B14A0 mov dword ptr [i],edx
- 012B14A3 mov esi,esp
- 012B14A5 mov eax,dword ptr [i]
- 012B14A8 push eax
- 012B14A9 mov ecx,dword ptr [i]
- 012B14AC push ecx
- 012B14AD mov edx,dword ptr [ebp-0D0h]
- 012B14B3 push edx
- 012B14B4 mov eax,dword ptr [ebp-0D4h]
- 012B14BA push eax
- 012B14BB push offset string "%d,%d,%d,%d\n" (12B573Ch)
- 012B14C0 call dword ptr [__imp__printf (12B82BCh)]
- 012B14C6 add esp,14h
- 012B14C9 cmp esi,esp
- 012B14CB call @ILT+320(__RTC_CheckEsp) (12B1145h)
复制代码 |
|