Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1016141
  • 博文数量: 146
  • 博客积分: 3444
  • 博客等级: 中校
  • 技术积分: 1602
  • 用 户 组: 普通用户
  • 注册时间: 2009-01-21 15:18
文章分类

全部博文(146)

文章存档

2014年(9)

2013年(3)

2012年(6)

2011年(44)

2010年(38)

2009年(46)

分类: C/C++

2011-10-09 10:39:32

int a=1;
执行sa=a++ 或 sa=(a++);后sa的值是一样的,都是1;
两个程序编译后的汇编代码完全一样,如下:
 .file "eee.c"
 .def ___main; .scl 2; .type 32; .endef
 .section .rdata,"dr"
LC0:
 .ascii "a=%d sa=%d\0"
 .text
.globl _main
 .def _main; .scl 2; .type 32; .endef
_main:
 pushl %ebp
 movl %esp, %ebp
 subl $24, %esp
 andl $-16, %esp
 movl $0, %eax
 addl $15, %eax
 addl $15, %eax
 shrl $4, %eax
 sall $4, %eax
 movl %eax, -12(%ebp)
 movl -12(%ebp), %eax
 call __alloca
 call ___main
 movl $1, -4(%ebp)
 movl -4(%ebp), %edx
 leal -4(%ebp), %eax 如果是++a则编译后这句和下一句顺序会交换。
 incl (%eax)
 movl %edx, -8(%ebp)
 movl -8(%ebp), %eax
 movl %eax, 8(%esp)
 movl -4(%ebp), %eax
 movl %eax, 4(%esp)
 movl $LC0, (%esp)
 call _printf
 movl $0, %eax
 leave
 ret
 .def _printf; .scl 2; .type 32; .endef
 
执行sa=++a后的sa的值是2;
 
#include "stdio.h"
int main(){
 int a[5]={0,1,2,3,4};
 int i=0,b;
 b=a[i++]; //不同点在这里
 printf("%d %d\n",i,b);
 return 0;
 }
的执行结果是1,0
 
#include "stdio.h"
int main(){
 int a[5]={0,1,2,3,4};
 int i=0,b;
 b=a[++i]; //不同点在这里
 printf("%d %d\n",i,b);
 return 0;
 }
的执行结果是1,1
阅读(1176) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~