浅谈C语言中自增自减运算符的应用

时间:2022-09-19 07:48:14

浅谈C语言中自增自减运算符的应用

摘要:C语言的运算符,操作灵活,其中自增自减运算符的功能较为特别。合理的使用自增自减运算符可以提高程序执行的效率,但同时也是最难理解和容易出错的运算符,该文就自增自减运算符在C语言灵活应用的几个方面做一点探讨。

关键词:C语言;自增运算符;自减运算符

中图分类号:TP312文献标识码:A文章编号:1009-3044(2010)17-4714-02

Discussion on the Application of Auto-increment Auto-decrement Operator in C Programming Language

ZHOU Liang

(Information Technology Department, Jiujiang University, Jiujiang 332005, China)

Abstract: The operation of C programming language operator is flexible. Meanwhile, the function of Auto-increment auto-decrement operator is very special. The reasonable use of Auto-increment auto-decrement operator can improve the efficiency of the program implementing but this kind of operator is also the most difficult to understand and the easiest one to err. This thesis mainly discusses several aspects on the flexible application of Auto-increment auto-decrement operator.

Key words: C programming language; Auto-increment operator; auto-decrement operator

C语言具有丰富的运算符,灵活使用这些运算符可以提高程序的运行效率。其中自增自减运算符是C语言的一个重要运算符,灵活的使用好自增自减运算符,可以编写出灵活高效的源代码。但由于它过于灵活,不易掌握,在加上很多教科书上对这个问题讲得不够透彻,从而导致理解上的混淆。下面对Turbo C环境中自增、自减运算符的功能及应用作一点探讨。

1 自增自减运算符

C语言中自增运算符为“++”,其作用是使变量的值增1;自减运算符为“--”,其作用是使变量的值减1。其操作对象只能是变量。自增、自减运算符包括两种形式:前缀式(++i,--i)和后缀式(i++,i--)。前缀式的含义为:先使变量增(减)1,在使用该变量,后缀式的含义为:先使用该变量,再使变量增(减)1,即前缀运算是“先变后用”,而后缀运算是“先用后变”。例如:

i=3;

x=++i; /*在使用i之前,i值先加1,在将i的值赋给x,运算结果:x=4,i=4*/

y=i--; /*先将i的值赋给y之后,再将i值加1,运算结果:y=3,i=4) */

2 赋值表达式中自增自减运算符的应用

在前面我们已经知道了自增自减运算符的作用,并且它的优先级别要比赋值运算符,算术运算符要高很多,即前缀式在赋值语句中先按照“从右至左”的结合性进行自增、自减运算,再进行其它运算; 若作为后缀形式,其运算优先级低于其它算术运算,即先进行其它算术运算,再按照“从右至左”的结合性进行自增、自减运算。例如如下程序:

main ( )

{ int i,k;

i=3;k=(i++)+(i++)+(i++);printf(“k=%d,i=%d\n”,k,i);

i=3:k=(++i)+(++i)+(++i);printf(“k=%d,i=%d\n”,k,i);

i=3:k=(++i)+(i++)+(++i);printf(“k=%d,i=%d\n”,k,i);}

分析:依照我们前面的规则在赋值表达式k=(i++)+(i++)+(i++)中,i++是后缀形式,因此,变量i先进行算术运算,那么变量k=3+3+3=9;最后在进行自增运算后变量i=6。赋值表达式k=(++i)+(++i)+(++i)中++i前缀式则跟前面刚好相反。因此先将i的值“从右至左”的结合性进行自增后i的值变成6,即k=6+6+6=18。赋值表达式k=(++i)+(i++)+(++i)中即有前缀又有后缀,按照我们的分析,i先进行2次加1运算,++i,++i;那么i的值变成5,然后参加算术运算后k=5+5+5=15,最后i的值在加1,i的值变成6。所以以上程序运行完后的结果为:k=9,i=6; k=18,i=6; k=15,i=6。

3 逻辑表达式中自增自减运算符的应用

先看如下的程序:

main()

{int a=10,b=20,c=30,d;

d=++a||--b||++c;

printf(“a=%d,b=%d,c=%d,d=%d\n”,a,b,c,d);}

按照前面的运算原则,自增自减运算符的优先级要比逻辑运算符级别高,那么应该先计算++a,--b,++c;把a和c的值加1,在把b的值减1,最后来执行a||b||c;那么该程序运行完之后的结果应该是a=11,b=19,c=31,d=1。但实际上在Turbo C环境中运行的结果却是a=11,b=20,c=30,d=1也就是说变量b和c的值没有发生改变,只有++a的值运算了,而变量b和c的值没有被改变。因为在C语言中对逻辑运算符有特殊的规定,即短路特性:如果通过前面表达式的值能够判断出整个表达式的值,就没有必要再计算后面的表达式了。这样的设置是为了加快逻辑表达式的执行速度。在上面的程序中++a的值为11结果为真,那么对于逻辑或运算而言就没有必要在继续判断下去了,所以不论后面表达的值是真是假,结果肯定是真,那么--b,++c就不会执行了,这个例子说明:自增自减运算符用于逻辑表达式中时,它们的优先级关系受到逻辑运算符特点的制约。

4 循环结构中自增自减运算符的应用

我们知道在C语言中循环结构由三种循环结构语句来实现,分别是while语句、do-while语句和for语句。前两个语句为条件循环,即根据条件来决定是否循环;后一个语句为计数循环,即根据设定的执行次数来执行循环。不管是那一种循环结构语句都有使循环趋于结束的语句,这样的语句一般由i++,i--这样的语句来实现,其中 i为循环的变量,在循环体中改变循环变量的值若干次后,使循环的条件不满足,从而结束循环。若在循环体中没有这样的语句,那么程序将无限循环下去陷入死循环。

当然在循环结构中使用自增(自减)运算符,只有在步长增1或减1的情况下使用,在其它情况下,还应使用赋值表达式来完成改变循环变量值的功能。

5 自增自减运算符在printf()函数和函数实参中的应用

C标准没有具体规定函数参数求值的顺序是自左至右还是自右至左。但每个C编译程序都有自己的顺序。在Turbo C中规定函数参数的求值顺序是“从右至左”,而且把各个参数看成独立的表达式,因此,自增、自减运算符出现在printf()函数中时,要对每一个表达式求解。

例如:i=8;

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

在上个例题中,从右至左依次对每个表达式求解,变量i的值先加1,得到++i的值为9,同样在把变量i的值先加1,得到第2个++i的值为10,第3个i的值自然也就是10了,再从左到右输出:10,10,9,这和实际的结果一样。

前面例题我们已经知道在Turbo C中函数参数的求值顺序是“从右至左”,那么函数进行值传递也是按照自右而左的顺序进行赋值的,即:先将最后一个实参的值赋给最后一个形参,在将倒数第二个实参的值赋给倒数第二个形参,依次进行赋值。如果在函数的实参中包含自增自减运算符,那么这个原则就一定要遵循。例如:

main()

{ int i=2,p;

p=f (i,++i);

printf("%d",p);}

int f(int a, int b)

{ int c;

if (a>b)c=1;

else if (a= =b) c=0;

else c=-1;

return (c);}

首先把实参++i的值传递给b,那么b=++i;i的值先变成3,b的值也变成3,在把倒数第2个实参i传递给a,即a=3;程序运行完后的结果为0,这和实际结果一样。如果反过来进行值的传递,那么变量a=2,b=3;程序运行完后的结果为-1,不正确。因此用自增自减运算符作为函数实参进行传递时,一定要注意顺序。

6 结束语

本文对自增自减运算符的应用做了一些讨论,希望能给初学者带来帮助。

本文讨论的是在TurboC环境下的自增自减运算符,对于不同的C编译系统,情形可能会有不同,请上机验证。

参考文献:

[1] 谭浩强.C程序设计[M].2版.北京:清华大学出版社,2002.

[2] 杨路明.C程序设计教程[M].2版.北京:北京邮电大学出版社,2005.

[3] 郭磊.关切值法与自增运算变量值的确定[J].安阳师范学院学报,2005(3).

[4] 李凤霞.C语言程序设计[M].北京:北京理工大学出版社,2001.

上一篇:Web服务器攻击信息的查找与分析 下一篇:Delphi与Word的融合技术在科技奖励评审系统中...