自加运算的误区!

大家先来看这样一个小程序

  1. #include <stdio.h>
  2. main()
  3. {
  4.        int i=5, b;
  5.        b= (++i) + (++i) + (++i) + (++i);
  6. }

 

问程序执行后b的值是多少?

请你先不要用编译器,自己算一下,然后再运行程序看一下,可能你会发现你算的结果和编译器的结果并不一样!

不信你可以自己试试。(如果你算对了就不要往下看文章了)

 

有人说我这样很无聊,谁也不会这么写程序,哪会犯这样的错误。

如果您也这么觉得,那你也没必要往下看了,如果您觉得有必要追究一下这个问题,那么就继续看一下吧!

我问过大概20个人这个问题,他们有的是大龄程序员,有的是大学生,有的是资深C语言教师,但这20个人里很不幸,没有一个人答对了这个问题,但有人强调这是编译器的不同,却又没有人找出不同结果的编译器。

于是我自己写了这个程序逆向了一下,看到程序是这样执行的。

 

首先i执行了2次自加操作,目的是结合第一个“+”运算符计算和值,然后i又执行了一次自加,目的是结合第二个“+”,最后i又自加了一次结合最后一个“+”输出结果。

结果是b=7+7+8+9=31;

 

GCC4.0和VC6.0的运算方式基本相同,只是VC编译后执行过程多用了几个寄存器,自加的时候用ADD指令,而GCC只用一个EAX寄存器,自加的时候用INC指令来完成。

 

那么现在这种算式的规律就是,每遇到一个“+”运算符,先把左边计算完成后再与右边的终值相加。

 

文章说到这里就应该清楚了,这其实是个很浅显的问题,我希望看过这篇文章的朋友以后不会再犯和我一样的错误了,这个问题是刚学C语言的学生问我的,我却很从容的答错了,真的比较丢人啊!呵呵!

 

欢迎感兴趣的朋友和我一起讨论,或许您有另一番理解。

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值