自加运算的误区!

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

  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语言的学生问我的,我却很从容的答错了,真的比较丢人啊!呵呵!

 

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

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章