深圳市通拓科技面试题:关于c语言一个很简单的i++表达式的问题~

来源:百度文库 编辑:中科新闻网 时间:2024/04/30 13:32:11
i=3
a=(++i)+(++i)+(++i)
请问高手这道题的运算结果是什么~请解释,不要只给结果~谢谢啦~
我最开始也算得是15,可是后来看了答案后得知结果为18,我不相信,上C平台,将原码输入验证~税制运行结果果真为18,请高手解释一下为什么~

这个程序不同编译器编译后,结果是不一样的。这个问题的答案跟编译器如何安排寄存器存放中间变量有关。

先说15的解释,这是使用了3个寄存器保存每一步的中间结果的情况。

VC的CL编译后的结果是16,因为使用1个寄存器保存第一步结果,就是(++i)+(++i),此时,i=5,中间结果为10,再加第三个(++i),此时i=6,结果=16。

18的情况是,i只有1个寄存器,先把每个++i做过,得到i=6,然后再做3个i的加法,得到18。

因为这个问题的结果与编译器有关,所以如果是考试会指明编译器环境的。

首先,++i和i++的区别是:
++i是自加了再运算
i++是运算了再自加

题目里第1次++i后,成了:
a=4+(++i)+(++i)
第2次++i后,成了:
a=4+5+(++i)
第3次++i后,成了:
a=4+5+6
结果:
a=15

你指的C平台就是编译器吧。这个表达式不同的编译器对其的理解是不同的。
18的由来是编译器认为先自加3次然后赋予每个++i。即6+6+6

因为根据C语言语法,对于++在前的自增,所有i先自增完后,再计算其所属语句,i先经过三次自增变为6,之后在代入该语句可得6+6+6=18。

运算之前先自加1、一共加了3次