首页 > 范文大全 > 正文

C语言中的自加自减运算

开篇:润墨网以专业的文秘视角,为您筛选了一篇C语言中的自加自减运算范文,如需获取更多写作素材,在线客服老师一对一协助。欢迎您的阅读与分享!

【摘 要】C语言中运算符十分丰富,自加运算和自减运算是c语言的教学中的重点和难点,但我们只要在教学中抓住运算的基本定义,通过经典题型分析和适度深入解析,就不难达到熟练应用之目的。

【关键词】运算的定义;经典题型;深度解析

C语言作为一种计算机程序设计语言,它既具有高级语言的特点,又具有汇编语言的特征,编程功能十分强大。C语言定义了丰富的运算,多达40余种,这给c语言的学习带来了一定的困难。++运算(自加运算)和--运算(自减运算)正是这些运算中极具特点而又非常重要的两种运算,在教学中,历来是教学的难点,而关于这方面的系统的讲解资料又很难找到,本人在c语言教学中,对++和--运算就教学中碰到的问题,做了一些探索性的研究,现归纳总结,以期与同行共勉。

一、运算的定义

1. ++(自加运算)的定义

++(自加运算)是单目运算,且只能以变量为运算对象,如i++,++a等(i,a为已定义变量),它等效于i=i+1(a=a+1),但是,自加运算又有自己的特点――与其它运算的相关性,虽然对变量i来讲,i++与++i没有什么区别,但当i++和++i还参与其它运算时,i++和++i对整个运算结果的影响是不同的,例如有如下程序段:

int i=1 ,s ;

s=(i++)+1;

printf(“i=%d;s=%d\n”,i,s);

其运行结果是:i=2;s=2

若将程序中s=(i++)+1;换为s=(++i)+1;其它不变,其运行结果就会变为:i=2;s=3 ,此处我们可以看到: i++与++i的不同,并不影响i本身的结果,但却对s的值产生了不同的影响,这是因为系统在处理++i时先对i进行了加1运算,即:i=i+1,然后才参与其它运算,而在执行i++时,现将i的值参与其它运算,然后才给自己加1,所以得到的s的值是不同的,这正是++(自加运算)与众不同的地方。

2. --(自减运算)的定义

与自加运算类似,--(自减运算)也是单目运算,且只能以变量为运算对象,若i为已定义变量,i的自减运算分为--i和i-- ,两者对i自身的作用是一样的,即i=i-1 ,但当它们还参与其它运算时,--i先执行自减1运算,然后以i的值参与其它运算,i--则先以i值参与其它运算,然后对i进行自减1运算。

二、经典题型

下列程序执行后输出结果是什么?

main()

{int a=100;

printf(“a++=%d;”,a++); */①/*

printf(“++a=%d;”,++a); */②/*

printf(“a--=%d;”,a--); */③/*

}

当程序执行到①时,输出表达式a++,由于自加符++后置,故先输出a的值100,然后a自加1,即执行完①后输出“a++=100”,a的值是101。

当程序执行到②时,输出表达式++a,由于自加符++前置,故a先自加1变为102,然后输出a的值102,即执行完②后输出“++a=102”,a的值是102。

当程序执行到③时,输出表达式a--,由于自加符--后置,故先输出a的值102,然后a自减1,即执行完③后输出“a--=102”,a的值是101。

综上所述,程序输出结果为:

a++=100;++a=102;a--=102

小结:该题目只要深刻领会++(--)运算在运算符前置和后置时,对其参与的其它运算(操作)的处理时机是不同的,前置时先进行自加1(自减1)运算,再进行其它运算(操作),后置时先参与其它运算(操作),再进行自加1(自减1)运算。

三、深度解析

1. 分析下列程序执行后的输出结果

#include

main( ){

int i =1,j=2, p=0,q=0 ;

printf(“%d,%d,%d,%d”, p+i , j++ , q+j ,-- i ); */⑤/*

}

很多同学分析:在程序执行到⑤时 p+i输出1(0+1=1) ;j++输出2(j=2),j=2+1=3 ;q+j输出3(0+3=3);--i输出0(1-1=0) 。得到的结果是:1 ,2 ,3 ,0 。然而上机运行的结果却是:0 ,2 ,2 ,0 ,这是为什么呢?原来,turboC在printf()函数中,处理表达式列表的顺序是从右到左进行的,如果在表达式列表中不包含自加(自减)运算,从哪边开始处理数据都不会影响运算结果,但是,如果表达式列表中包含了自加(自减)运算,这个“处理数据的顺序”就会影响到数据的运算结果。正确的做法是先处理―i,输出0(1-1=0);其次是q+j,输出2(0+2=2);再次是j++,输出2(j=2,执行j++后j=3);最后是p+i,输出0(0+0=0),处理完毕后按原来顺序输出结果:0,2,2,0 。

结论:turboC在printf(“字符串”,表达式列表)函数中,处理表达式列表的顺序是从右到左进行的,如果在表达式列表中包含自加(自减)运算,运算起来就要十分细心。

2.分析如下程序输出结果:

#include

main( ){

int i=5,j=5,p,q;

p=(i--)+( ++ i)+(i++); */ ⑥/*

q=(++j)+( j++); */ ⑦/*

printf(“%d,%d,%d,%d”,p,q,i,j);

}

严格的讲,程序中⑥、⑦中的表达式是不符合C语言语法规范的。尽管如此,但在实际当中,我们仍会经常碰到类似的题目,而且这些题目在机器上运行也会有特定的结果,因此在这里我仍然想探讨一下其解法。

笔者经过反复推敲,找到了一种解决这类问题的办法,并在实际应用中与机器执行的结果符合的很好。

我的思路是:将⑥或⑦中右侧表达式的运算分为3类:前置(自加或自减)运算、后置(自加或自减)运算和加(减)法运算,首先要进行的是前置运算,其次执行加(减)法运算,最后执行后置运算。如(i--)+( ++ i)+(i++),其中中间的自加运算为前置运算,其前后的自减运算和自加运算都是后置运算,首先进行前置运算,即++i,执行后i=5+1=6;然后执行加法运算,即3个i相加;结果为6+6+6=18,最后执行后置运算,即i=6+1-1=6 。所以题目中p=18,i=6。同理(++j)+( j++)中++j为前置运算,j++为后置运算,先进行前置运算j=5+1=6;然后执行加法运算,即2个j相加6+6=12;最后进行后置运算j=6+1=7 。所以题目中q=12,j=7,程序最后运行结果为:18,12,6,7 。以上方法可扩展到任何含有自加(自减)运算的运算表达式中。

四、结论

当一个表达式中含有多个自加(自减)运算时,可将运算分为前置运算、后置运算和其它运算,按照先执行前置运算,然后执行其它运算,最后执行后置运算的法则,可得到正确的运算结果。

对C语言的教学而言,能让学生理解到以上的深度,我认为教学的任务就完成了,至于更深层次的研究就是他们以后的事了,希望本文能给广大C语言教学工作者带来便利!

参考文献:

[1] Dennis M. Ritchie等. The C programming Language [M].U.S:Prentice Hall,1988

[2]周查金等. C语言程序设计.北京:高等教育出版社,2000.5