|
发表于 2009-5-8 23:34:38
|
显示全部楼层
原帖由 MOV 于 2009-5-8 16:59 发表
这个文章可以看看
如果有表达式 a = i++ 它等价于 a = i ; i = i + 1;
如果有表达式 a = ++i 它等价于 i = i + 1; a = i;
1 首先两者的区别是:前者是先赋值,然后再自增;后者是先自增,后 ...
我也看了一下:- #include "stdio.h"
- main()
- {
- int i=8;
- printf("%d\n%d\n%d\n%d\n%d\n%d\n",++i,--i,i++,i--,-i++,-i--);
- }
复制代码 运行结果:
8
7
7
8
-7
-8
扔进IDA:
- seg000:01FA ; int __cdecl main(int argc, const char **argv, const char *envp)
- seg000:01FA _main proc near ; CODE XREF: start+11Ap
- seg000:01FA
- seg000:01FA argc = word ptr 2
- seg000:01FA argv = dword ptr 4
- seg000:01FA envp = dword ptr 8
- seg000:01FA
- seg000:01FA push si
- seg000:01FB mov si, 8 ; si=8
- seg000:01FE mov ax, si ; ax=8
- seg000:0200 dec si ; 7
- seg000:0201 neg ax ; -8
- seg000:0203 push ax ; -8第六个[-i--]
- seg000:0204 mov ax, si ; i++
- seg000:0206 inc si ; -i++
- seg000:0207 neg ax ; -7
- seg000:0209 push ax ; -7第五个
- seg000:020A mov ax, si ; 8
- seg000:020C dec si ; i--
- seg000:020D push ax ; 8第四个
- seg000:020E mov ax, si ; 7
- seg000:0210 inc si ; i++
- seg000:0211 push ax ; 7第三个
- seg000:0212 dec si ; --i
- seg000:0213 mov ax, si
- seg000:0215 push ax ; 7 第二个
- seg000:0216 inc si ; ++i
- seg000:0217 mov ax, si
- seg000:0219 push ax ; 8第一个
- seg000:021A mov ax, 194h
- seg000:021D push ax ; format
- seg000:021E call _printf
- seg000:0221 add sp, 0Eh
- seg000:0224 pop si
- seg000:0225 retn
- seg000:0225 _main endp
复制代码 这样一来就很明了了,哪个是先加,哪个是后加一目了然。
由于C的调用约定是右向左,所以右边的先入堆栈。而printf函数是先输出左边的再到右边的。因此输出结果是8 7 7 8 -7 -8
看来了解汇编之后再学C就理解得比较深刻一些。 |
|