i++与++i

发布时间:2018-06-29 21:23:22   来源:文档文库   
字号:

C程序中的“i++++i

毛圣治

i++++i 对很多初学CC++ 的学生困惑。说来容易算来难。下面就个人对例题的理解,以MICROSOFT VC6.0Turbo C2.0 调试通过的结果做一个小结。

1、 i++++i中的i ,不能为常量或表达式。如2++,(a+b)++,++3等均出现错误,不能通过编译。

2、 i++++i均相当于执行i=i+1,i++是先取i的值用于表达式的计算,整个表达式计算结束后才自增1VC6中,++i是在表达式按运算优先级计算前对操作数先自增1。长表达式是分步计算的,对表达式中所有还没有计算的所有操作数i 均有影响。对已经计算了的表达式部分中的操作数i 均无影响。也就是说边算边确定i的值。Turbo C2.0 则是先对整个表达式扫描,对++i,执行自增运算,确定整个表达式中所有的操作数i的值,而不管表达式有多长,然后才按运算优先级进行运算,要等整个表达式运算结束后,再对整个表达式中的i++执行自增运算。

3、 用于函数的参数时,不同的系统可能有不同的运算顺序。MICROSOFT VC6.0 Turbo C2.0均是从右至左。

4、 例题讲解:

例题1

#include

main()

{ int i=5,k;

k=(i++)+(i++)+(i++);

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

}

// VC6TC2 结果一样:k=15 i=8

说明:先取i 的值5计算,然后进行3次自增1

例题2

#include

main()

{ int i=5,k;

k=(i++)+(i++)+(++i);

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

}

//VC6.0 k=16 i=8

//Turbo C2.0 k=18 i=8

说明:VC6:按运算优先级,先从左至右计算(i++)+(i++)=10,再计算10+(++i),因为++i要先增1,所以k=16,在表达式计算结束后,因为前两个(i++)还没有自增,所自增后,i=8. TurboC2.0:先对表达式扫描,第三个++i自增1,三个i 相加k=18,然后前二个i++自增1两次,i=8.

例题3

#include

main()

{

int i=5,k;

k=(i++)+(++i);

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

}

//VCTC k=12 i=7

说明:先取i 的值5,再对++i 实行自增1,(现在还没有执行加法),前面i++与后面++i中的i均变成了6,现执行加法运算,所以k=12,计算后i++自增1i=7

例题4

#include

main()

{

int i=5,k;

k=(++i)+(++i)+(++i);

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

}

//VC6 k=22,i=8

//TC 2.0 k=24,i=8

说明:VC6边算边确定i的值。先对第一个++i 实行自增1,再对第二个++i 实行自增1(现在还没有执行加法),前面++i与后面++i中的i均变成了7,现执行加法运算,所以(++i)+(++i)=14,计算后第三个++i自增1i=8,前两个已计算无影响了,(++i)+(++i)+(++i)=22。而TC2.0先对表达式扫描,让++i自增3次,然后相加k=24.

例题5

#include

main()

{

int i=5,k;

k=(++i)+(i++)+(++i);

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

}

//VC6.0 k=19,i=8

//TC2.0 k=21,i=8

说明:先对第一个++i 实行自增1,再对第二个i++ i的值(现在还没有执行加法,i=6)进行计算,得(++i)+(i++)=12,再对第三个++i中的i自增1变成了7,执行加法运算,k=19,执行完后第二个i++自增1i=8

例题6

#include

main()

{ int i=5,k;

k=(++i)+(i++)+(++i)+(++i);

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

//VC6.0 k=27, i=9

//TC2.0 k=32, i=9

说明:先对第一个++i 实行自增1,再对第二个i++ i的值(现在还没有执行加法,i=6)进行计算,得(++i)+(i++)=12,再对第三个++i中的i自增1变成了7,执行加法运算,(++i)+(i++)+(++i)=19,再对第4++i自增1i=8,执行19+8=27

k=(++i)+(i++)+(++i)+(++i)=27,最后才对第二个i++自增1i=9.

例题7

#include

main()

{

int i=5;

printf("first i=%d,second i++=%d,third ++i=%d,forth i=%d \n",i,i++,++i,i);

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

}

//VC6.0 first i=6 ,second i++=6,third ++i=6,forth i=5

//VC6.0 last i=7

//TC2.0 first i=7 ,second i++=6,third ++i=6,forth i=5

//TC2.0 last i=7

说明:VC6.0在函数的参数列表中,是自右至左进行运算,整个参数列表当成一个表达式。要等整个参数列表运算结束后才对i++执行自增运算。本例中先输出最后的forth i为初始值5,再算third ++i, i自增1变为6,再取i++中的i值为6second i=6,再输出first i=6,i值使用完成后,second i自增运算,i=7, 所以最后的last i=7. TC2.0 也是从右至左,但是把每个参数计算完成后对i++自增,再计算左边的一个参数表达式。

本文来源:https://www.2haoxitong.net/k/doc/4ab72db01a37f111f1855be1.html

《i++与++i.doc》
将本文的Word文档下载到电脑,方便收藏和打印
推荐度:
点击下载文档

文档为doc格式