万恶的c未定义行为笔试题

原文链接:http://freakrobot.blogbus.com/logs/83841989.html

#include 
int main(int argc ,char *argv[])
{
        int n,j;
        j = 3;
        n = (++j)+(++j)+(++j);
        printf("%d",n);

        return 0;
}
输出结果为什么是16?

gcc -g test.c -o test
objdump -S -d test >test.S

反汇编,

       int n,j;
        j = 3;
8048532:   c7 44 24 18 03 00 00    movl   $0x3,0x18(%esp)  //将3放在栈里面
8048539:   00 
        n = (++j)+(++j)+(++j);
804853a:   83 44 24 18 01          addl   $0x1,0x18(%esp) //将栈里面的3+1=4
804853f:   83 44 24 18 01          addl   $0x1,0x18(%esp) //再+1 = 5
8048544:   8b 44 24 18             mov    0x18(%esp),%eax 
8048548:   01 c0                   add    %eax,%eax //将5+5 = 10
804854a:   83 44 24 18 01          addl   $0x1,0x18(%esp) //将栈里的5+1 = 6
804854f:   03 44 24 18             add    0x18(%esp),%eax //6+10=16
8048553:   89 44 24 1c             mov    %eax,0x1c(%esp)
        printf("%d",n);

先做前两个++j,++j在做j+j, 然后接着++j。

如果是n = (j++)+(j++)+(j++);

    j = 3;
 80483cd:    c7 44 24 1c 03 00 00     movl   $0x3,0x1c(%esp)
 80483d4:    00 
    n = (j++)+(j++)+(j++);

反汇编:
 80483d5:    8b 44 24 1c              mov    0x1c(%esp),%eax
 80483d9:    01 c0                    add    %eax,%eax
 80483db:    03 44 24 1c              add    0x1c(%esp),%eax
 80483df:    89 44 24 18              mov    %eax,0x18(%esp)
 80483e3:    83 44 24 1c 01           addl   $0x1,0x1c(%esp)
 80483e8:    83 44 24 1c 01           addl   $0x1,0x1c(%esp)
 80483ed:    83 44 24 1c 01           addl   $0x1,0x1c(%esp)
    printf("%d/n",n);

 

这个会不会跟编译器相关呢?

这个是c的未定义行为,

相关贴:

http://blog.ez2learn.com/2008/09/27/evil-undefined-behavior/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值