i++与++i

编译环境gcc4.4.1
如下代码
    int a = 4;
    a 
+= (a++);
    printf(
"%d\n",a);

    a 
= 4;
    a 
+= (++a) ;
    printf(
"%d\n",a);

    a 
= 4;
    (
++a) += a;
    printf(
"%d\n",a);

    a 
= 4;
    (a
+++= a;//a++不能作为左值参加运算。
    printf("%d\n",a);

    a 
= 4;
    (
++a) += (a++);
    printf(
"%d\n",a);
打印的值为9,10,10,11。汇编代码如下:
# a += (a++);
00401326    movl   $0x4,0x1c(%esp)
0040132E    mov    
0x1c(%esp),%eax
00401332    add    %eax,%eax
00401334    mov    %eax,0x1c(%esp)
00401338    incl   0x1c(%esp)
0040133C    mov    
0x1c(%esp),%eax
00401340    mov    %eax,0x4(%esp)
00401344    movl   $0x46f024,(%esp)
0040134B    call   
0x41c750 <printf>
#  a 
+= (++a) ;
00401350    movl   $0x4,0x1c(%esp)
00401358    incl   0x1c(%esp)
0040135C    mov    
0x1c(%esp),%eax
00401360    add    %eax,%eax
00401362    mov    %eax,0x1c(%esp)
00401366    mov    0x1c(%esp),%eax
0040136A    mov    
%eax,0x4(%esp)
0040136E    movl   $
0x46f024,(%esp)
00401375    call   0x41c750 <printf>
#  (
++a) += a;
0040137A    movl   $
0x4,0x1c(%esp)
00401382    incl   0x1c(%esp)
00401386    mov    0x1c(%esp),%eax
0040138A    add    
%eax,%eax
0040138C    mov    
%eax,0x1c(%esp)
00401390    mov    0x1c(%esp),%eax
00401394    mov    %eax,0x4(%esp)
00401398    movl   $0x46f024,(%esp)
0040139F    call   
0x41c750 <printf>
#(
++a) += (a++);
004013A4    movl   $
0x4,0x1c(%esp)
004013AC    incl   
0x1c(%esp)
004013B0    mov    
0x1c(%esp),%eax
004013B4    add    
%eax,%eax
004013B6    mov    
%eax,0x1c(%esp)
004013BA    incl   
0x1c(%esp)
004013BE    mov    
0x1c(%esp),%eax
004013C2    mov    
%eax,0x4(%esp)
004013C6    movl   $
0x46f024,(%esp)
004013CD    call   
0x41c750 <printf>

可以看出,在运算过程中,++a优先级> +=  > a++
1)先运算a+a,然后再自增a
2),3)先运算++a,然后再a+a
4)先运算++a,然后a+a,然后a++

posted on 2010-07-18 01:29 role0523 阅读(355) 评论(3)  编辑 收藏 引用

评论

# re: i++与++i 2010-07-18 02:31 chaogu

用汇编表达了一个很早就被默认了的定理,好还是不好呢?  回复  更多评论   

# re: i++与++i 2010-07-18 17:05 role0523

@chaogu
忘记在谁的blog上看到在比较i++和++i哪个操作更高效,于是就看看他们汇编指令的条数。其实大多数时候都是一样的。  回复  更多评论   

# re: i++与++i 2010-07-19 19:30 chaogu

@role0523
基本上是没有去区别的,有时候++i能被优化掉,但很多时候编译器能发现他们是一样的,所以没有区别。  回复  更多评论   


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


导航

<2010年7月>
27282930123
45678910
11121314151617
18192021222324
25262728293031
1234567

统计

常用链接

留言簿

随笔档案

搜索

最新评论

  • 1. re: i++与++i
  • @role0523
    基本上是没有去区别的,有时候++i能被优化掉,但很多时候编译器能发现他们是一样的,所以没有区别。
  • --chaogu
  • 2. re: i++与++i
  • @chaogu
    忘记在谁的blog上看到在比较i++和++i哪个操作更高效,于是就看看他们汇编指令的条数。其实大多数时候都是一样的。
  • --role0523
  • 3. re: 数组越界的陷阱
  • @陈梓瀚(vczh)
    嵌入式项目中 vector还是比较慎用的
  • --role0523
  • 4. re: 数组越界的陷阱
  • 不如用vector代替你的if
  • --陈梓瀚(vczh)
  • 5. re: i++与++i
  • 用汇编表达了一个很早就被默认了的定理,好还是不好呢?
  • --chaogu

阅读排行榜

评论排行榜