C语言表达式(++i)+(++i)+(++i)结果多少?

我在VC6.0环境下运行下列程序:
void Main()
{
int i=3,k;
k = (++i)+(++i)+(++i);
printf("%d\n",k);
}
结果为16,不知道编译器是怎么算出来的,求高手赐教!

结果为16,说明用的编译环境是VC++6.0,如用TC环境,则结果为18。

VC环境下,对于前增减运算(++i),自增自减是按从左到右扫描顺序,以一个运算符两边涉及前自增减的两个运算对象为单位进行之前增减的;对于后增减运算(i++),是以整个表达式为单位最后统一增减的。

如(i++)+(++i)+(++i)是先对第一个加法运算符两端的运算对象处理,先自增一次再求解表达式前两项,然后再对i自增一次再求前一步骤的值与最后一项的和,若初始值i=1,则最终结果2+2+3=7。

(++i)+(++i)+(++i),首先扫描求解前半部分,即(++i)+(++i)的值。先对i进行两次自增运算,i的值变为5,再计算i+i的值为5+5=10,然后再求解后半部分,即10+(++i)的值,先对变量i自增1次,i的值变为6,再计算10+6=16,所以最终把16赋给变量c。

扩展资料

表达式(++i)+(++i)+(++i)结果的源代码如下

#include <stdio.h>

#include <stdlib.h>

int main(int argc,char** argv)

{

int i=3,j;

j=(i++)+(i++)+(++i);

printf("i = %d, j = %d\n",i,j);

exit(0);

}

温馨提示:内容为网友见解,仅供参考
第1个回答  2008-09-07
答案为18吧?如果是18。我有个解释是:

有两点大家一定要弄明白:

一、(++i) 的编译(计算)过程是,取出变量 i 所代表的内存单元里存的值,把这个值加上 1 ,然后又放回去。具体编译过程是怎样的暂时不用管它。

二、k = a + b 的编译(计算)过程是,取出变量 a 所代表的内存单元里存的值和变量 b 所代表的内存单元里的值,两个值相加,把结果传送给 k 【或者是说把结果放到 k 所代表的内存单元里去】

这里(假设i=3)

编译器在看到 k = (++i) 时,过程是先把 i 完成自加,此时i的值就是4,【或者说,i 所代表的内存单元里存的值是 4】。

表达式此时虽然变成了 k = (i) 了,但实际上并不是准备要把 4 传送给 k ,而是 k = (*&i) ;意思是取 i 所代表的内存单元的值放到 k 所代表的内存单元里去。

【重点就是在这里,编译器只是准备把变量i所代表的内存空间里存的值传送给表达式左边而不是传送 数字4 ,这个涉及到数据存取问题,这里理解了就好说了】

此时编译器看到表达式右边已经没有继续计算的步骤了,它就可以完成 k = (*&i) 这一步了。此时 i 所在内存单元里存的值正好是 4 ,所以传送给 k 的值也就是 4 了。这是最简单的情况。

下面,换成 k = (++i)+(++i)

编译器看到 k = (++i)+(++i) 时,第一步:算左边的 ++i,【i 所代表的内存单元里的值就变成了 4】,然后表达式就成了 k = (i) + (++i) 【实际上是 k = (*&i) + (++i)】;

第二步:编译器看到后面还有一个加号,它就只好继续往下走,在看到加号这样的2目运算符时 ,它就必须马上找到 加号 另一边的表达式 并求出其值。此时编译器在加号右边又看到了(++i),他就只好再算一次(++i),所以,取出 i 的值是第一步中算完的 i 的值【4】,把这个值加 1 ,结果就是把【5】放回了 i 所代表的内存单元里去了。【注意, 此时 i 所代表的内存单元里的值就是 5】,此时表达式变成了 k = (i) + (i) 。【实际是 k = (*&i)+(*&i)】

第三步:编译器看到加号两边的表达式都算完了,就可以完成加的操作了,所以开始计算 (i)+(i) 【实际是 (*&i) + (*&i)】,由于 i 的值现在是 5 ,所以就是 5 + 5 ,而不是 4 + 5 。整个结果是 10 。

最后:编译器看到右边再没有需要计算的了,就完成最后的操作: 传送 (等号)右边的值 给(等号)左边。所以最好 k = 10 。 k 的值是【10】

所以分析 k = (++i)+(++i)+(++i) ,最后就是 k = (*&i)+(*&i)+(*&i) ;而大家也知道 最后的 i 值是经过三次自加的结果【6】,这样一来,K 最后的值就是 k = 6 + 6 + 6 了。结果是 【18】。

这就是我的分析,楼主说结果是 16 .我也就不知道是怎么回事了。
第2个回答  推荐于2018-03-15
呵呵,有意思.
在VC中应该这样理解:
做类似(++n)运算是直接在内存中完成的,相当于是用汇编里的自加运算,直接修改内存中n的值. 因此,做第一次(++i)后,i=4,做第二个(++i)后,i=5;此时才做第一次括号外的加法,并把结果保存在临时变量中temp=10;而此时内存中的i已经是5了. 然后在做一次(++i),即i=6;
此时i与临时变量temp相加,就是最终结果k=16.

不信,你可再加一个(++i),此时,i=7;结果k为23.

所以,这样完全可以推出它的运算机制.本回答被提问者和网友采纳
第3个回答  2008-09-07
不同的编译器组合方法不同,tc2.0下为18;
i=i+1; 为4
i=i+1; 为5
i=i+1; 为6
k=i+i+i 为6+6+6=18
VC 下的确为16。
鄙视教材中一而再,再而三的出现这样的垃圾问题。
不提倡这种写法。不同的环境中结果不一样。可移植性差,依赖编译器的组合方法。

C语言里面明确指出:在两个顺序点之间两次改变同一个变量的任何尝试得到的结果都是不确定的!
如这里
int i=10;
printf("%d,%d,%d\n",++i,--i,-i++);
的两个顺序点分别是int i=10;的分号,和包围printf的参数的括号,C语言只保证位于两个顺序点之间的表达式求值产生副作用在第二个顺序点之前生成,但不保证两个顺序点之间所有表达式的求值顺序。你这里++i,--i,-i++三个表达式企图在两个顺序点前一个分号和()之间三次改变同一个变量i的值,所以结果注定是不确定的。至于为什么C语言要规定相邻顺序点之间的表达式以任意顺序求值,是为了给编译器更多的自由空间,让底层运算操作能由编译器调度安排从而使运算更有效地执行。
第4个回答  2008-09-07
int i=3,k;
k = (++i)+(++i)+(++i);

第一个括号里的值为4(i先自加1后再使用),这里i的值变为4,第二个括号里的值则变成5,同理第三个括号里的值为6,所以最后K的值为4+5+6=15

但是不同的环境结果可能不一样,这个在我们上课的时候老师也跟我们说过,所以我们在使用的时候就要注意不要使用那些结果不明确的表达式。

C语言表达式(++i)+(++i)+(++i)结果多少?
结果为16,说明用的编译环境是VC++6.0,如用TC环境,则结果为18。VC环境下,对于前增减运算(++i),自增自减是按从左到右扫描顺序,以一个运算符两边涉及前自增减的两个运算对象为单位进行之前增减的;对于后增减运算(i++),是以整个表达式为单位最后统一增减的。如(i++)+(++i)+(++i)是...

设整型变量 i 值为2,表达式(++i)+(++i)+(++i)的结果是
楼上都不对,最终答案是15。在此表达式执行的开始,i会被++三次,值变为5。然后5+5+5=15。

c语言中,i=1,(++i)+(++i)+(++i)=?
\/\/(++i)+(++i)+(++i)=?先说明一下:++i的意思可分解成以下两步:i=i+1,i再参与运算 上面的表达式运算过程:(同级运算从左到右,有括号先算括号)一、先运行第一个++i, i的结果是2 二、再运行第二个++i, i的结果是3 三、计算前两式之和。因为,此时运算的是i+i,所以是3+3...

C语言中,int i = 3; k = (++i)+(++i)+(++i) 问k的值是多少? 很是纠结...
答案应该是:15 解释如下:++i表示先自加,然后再用i,也就是说i本来是3,经过++i之后,变成了4,在进行运算,所以k=(++i)+(++i)+(++i)=4+(++i)+(++i) ;i变成了4 所以第二个++i是以4可是的,经过自加后为5,在进行运算,则为4+5+(++i);第三个与第二个类似,是以5开始的,...

C语言:如果i=3,则k=(++i)+(++i)+(++i)执行过后k的值为?好评立刻。
结果应该是18.编译程序是这样处理的,对有含有++i的表达式,先进行i的自增运算,然后再计算其所在的表达式。对于k=(++i)+(++i)+(++i)这个表达式,先计算其中的++运算,即连续进行三次的自增1,即i=6,然后再计算这个表达式,即6+6+6=18 ...

c语言中计算(++i)+(++i)+(i++)的值
假如i=10,那(++i)+(++i)+(i++)的结果是10+10+11=31,计算完成之后i的值是13。

设整型变量i值为2,表达式(++i)+(++i)+(++i)的结果是( )。 A. 6 B...
我们一步一步的看这个问题 int i=2;i++;\/\/i=2自加1后i为3 i++;\/\/i=3自加1后为4 I++;\/\/i=4自加后为5 所以:(++1)+(++1)+(++1)=13 是这个意思吧?那选择d吧!还有d你没写出来是吧?

一个简单表达式(++i)+(++i)+(++i)的值是多少?
i=4 ++i 5 ++i 6 ++i 7 结果18

帮忙计算一个C语言题目:先定义i=3,请计算(++i)+(++i)+(++i)的值!
++i 是i先加1,然后加1 后的结果进行下一步运算。第一个++i 和第二个++i 同时执行得到 i = 5。然后5+5 = 10。再将10 与第三个++i 相加,此时i = 6所以最后i = 16。做加法时要先求两边表达式,而且只有一个变量。

(++1)+(++1)+(++1)算法?C语言中
那么i=2,再到中间的i,现在它的值是2 ,再加上1,i=3,再到最后一个i,现在它的值是3,再加上1,i=3,那么结果是4。其实挺好记的,自增自减运算符在前就是先加1,再参加其他运算,在后就先参加运算再加1。上式表达式的正确形式是int=i;(++i)+(++i)+(++i);...

相似回答