APP下载

C语言中自增(自减)运算符的应用与分析

2016-02-23阚钿玉广东南方职业学院信息技术系江门529040

现代计算机 2016年15期
关键词:运算符表达式C语言

阚钿玉(广东南方职业学院信息技术系,江门 529040)



C语言中自增(自减)运算符的应用与分析

阚钿玉
(广东南方职业学院信息技术系,江门529040)

摘要:

关键词:

C语言;运算符;自增(自减)运算符

0 引言

C语言程序设计中,若合理使用自增(自减)运算符,则可以减少代码编写,提高编程效率;若不能正确掌握和运用,则容易出错[1]。通常初学者对自增(自减)运算符很是费解,但是,在C语言的众多教材和参考书中,对C语言中的自增(自减)运算符介绍非常简略,而实践操作中,使用频率较高,教学中,有必要对其进行详细分析,让学生理解并掌握不同使用形式中的不同解题思路和方法。

1 自增(自减)运算符的使用功能

通常C语言教材中把自增(自减)运算符归纳于算是运算符中,其符号分别为“++”或“--”,

其作用是使变量的值自己增1或减1,而运算结果仍保存在该变量的存储单元中,所以通常也称为增1或减1运算符[2]。自增(自减)运算符的操作对象只能是变量,而不能是常量或表达式,例如:m++、k--是合法的,而3++、(a+b)--是非法的,因为常量的值无法改变,所以不能自增1,若是表达式(a+b)--,假如a+b=7,自减后的值为6,而6是保存在a的存储单元中还是保存在b的存储单元中呢?无法确定,所以(a+b)--是非法的[1]。

自增(自减)运算符有两种形式:一种“++”或“--”在变量之前,称为前置运算,如++a;

一种是“++”或“--”在变量之后,称为后置运算,如b--[2]。前置后后置两种不同的表示方法最终会使自增(自减)运算方式不同,++a或--a指在使用之前先是a的值加1或减1,然后再参与别的运算,即“先变后用”;a++或a--指先用a原来的值去参与运算,然后再是a的值加1或减1,即“先用后变”[3]。当自增(自减)表达式作为单一语句出现时,二者没有区别,但把它们引用在表达式中则有明显区别。例如:

(1)a=m++,等价于:a=m;m=m+1;如果开始m=3,则执行a=m++后,a=3,m=4。

(2)a=++m,等价于:m=m+1;a=m;如果开始m=3,则执行a=++m后,a=4,m=4。

自增(自减)运算符是单目运算符,优先级为2,高于其他的双目运算符和三目运算符的优先级,但其结合性为右结合,即是按照“自右向左”的顺序来进行运算的。例如:

#include<stdio.h>

main()

{int m,n=5;

m=-n++;

printf(“m=%d,n=%d”,m,n);

此例m=-n++表达式中,程序是执行m=(-n)++,还是执行m=-(n++)呢?遇到运算符,我们就从“优先级”和“结合性”这两方面分析,这里“-”负号运算符和“++”自增运算符的优先级都是2,结合性都是右结合,C语言中规定:相同优先级的运算符的运算次序由结合性决定。而这两个运算符的结合性都是有结合,那么表达式m=-n++应该理解为m=-(n++),所以此程序的运行结果为:m=-5,n=6。对于初学者来说,编程是可以多加括号来避免出错。

2 自增(自减)运算符的使用形式

大部分学生在学习自增(自减)运算符时,都能够理解前置运算是“先变后用”,而后置运算是“先用后变”的运算规则,但当遇到具体实例或比较复杂的运算表达式时,则不知所措,很难灵活运用“先变后用”或“先用后变”这个规则,下面以实例逐一分析。

2.1自增(自减)运算符组在的复杂表达式语句中的应用

大家知道,C程序中计算模块的代码大部分由表达式语句组成,而这些表达式就是运算符和操作数连接起来的式子。我们在计算这些表达式时要从运算符的“优先级”和“结合性”这两方面讨论,自增(自减)运算符是单目运算符,优先级为2,而且是右结合,那么,在复杂表达式中,我们怎么运用“先变后用”和“先用后变”这个原则呢?

例1阅读以下程序,分析运行结果

#include<stdio.h>

void main()

{int m,n=8;

m=(n++)+(n++)+(n--);

printf(“m=%d,n=%d ”,m,n);

n=8;

n=(n++)+(n++)+(n++);

printf(“n=%d ”,n);

n=8;

m=(++n)+(++n)+(--n);

printf(“m=%d,n=%d ”,m,n);

n=8;

n=(++n)+(++n)+(--n);

printf(“n=%d ”,n);

分析:第4行m=(n++)+(n++)+(n--)中,由于自增(自减)运算符是后置运算,应执行“先用后变”的原则,则m=8+8+8=24,然后n的值在自增两次,自减1次,即n=8+1+1-1=9;这里很多初学者误解为m=8+8+ 10=26,我们一定要深入理解“先用后变”这个原则,虽然m=(n++)+(n++)+(n--)中前面两个n++相加得18,此时“先用后变”中的“用”还没用完,所以n的值不能改变,我们应该理解为m=8+8+8=24,所以第5行输出的结果为:m=14,n=9。

第7行n=(n++)+(n++)+(n--)中也是后置运算,道理与第4行代码相同,只是此时左边变量是n而不是m,所以计算出来的n=24后再自增2次,自减1次,则n=24+1+1-1=25,所以第6行的输出结果为n=25。

第10行m=(++n)+(++n)+(--n)中,由于前置运算,应该执行“先变后用”的原则,而内存是从左至右扫描,在VC6.0中,内存是扫描一段就计算一段,所以n应先自增两次变为10再相加,即m=10+10+(--n)=20+ (--n),然后n再先自减变为9,最后再参与算术“加法”运算,即m=20+9=29,所以第11行输出的结果为:m=29,n=9。第13行n=(++n)+(++n)+(--n)中,运算原理与第10行相同,只是左边的变量由m换成了n,所以第14行输出的结果为n=29。

例2阅读以下程序,分析运行结果

#include<stdio.h>

void main()

{int a,b,c;

a=b=c=1;

++a&&--b&&++c;

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

a=b=c=0;

++a||++b&&++c;

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

此例第5行表达式++a&&--b&&++c中有自增(自减)运算符和逻辑运算符,而自增(自减)运算符的优先级高于逻辑符,所以应该计算++a和--b,得出2&&0&&++c;此时要注意C语言中逻辑与和逻辑或运算都有短路特性,即如果在一个复杂的表达式中前一部分的值能够决定整个表达式的值,那么后面的表达式则不进行扫描计算,在2&&0&&++c中,无论++c的值是多少,表达式2&&0&&++c的值都是0,后面的++c没被执行,所以第6行的输出结果为:a=2,b=0,c=1。第9行表达式++a||++b&&++c中,由于计算机是从左只有扫描的,所以先执行++a得出1,此时表达式为1||++ b&&++c,而此表达式无论++b&&++c的结果是多少,整个表达式1||++b&&++c的值始终是1,后面的++b 和++c不被执行,b,c的结果还是1,所以第10行的输出结果为:a=1,b=0,c=0。

2.2自增(自减)运算符在循环结构中的应用

C语言中的循环结构有三种语句:while语句,do……while语句,for语句。无论哪种循环语句,都必须有改变循环变量而使循环条件不成立的语句,而这样的语句经常是循环变量自增(自减)表达式语句,若i为循环变量,则经常被用来使循环趋于结束的语句是i++或i--,最常见的for语句就是这样的,例如for(i=1,s=1;i<=10;i++)s=s*i;当i=11时,循环条件不成立,循环结束,所以在循环结构中,自增(自减)运算符一般是改变循环变量的作用。

2.3自增(自减)运算符在printf()函数中的应用

在VC6.0运行环境下,printf()函数执行过程是将函数实际参数表达式的值按照从右至左的顺序入栈,入栈前就将printf()函数实际参数表达式的值计算完毕,被调函数从栈中取出参数使用,如果printf()函数有多个参数,则它们是按照从右至左的顺序计算,但是printf()函数输出结果的顺序仍是从左至右,与计算机扫描顺序一致。

例3阅读以下程序,分析运行结果

#include<stdio.h>

void main()

{int i=8;

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

printf(“%d ”,i);

i=8;

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

printf(“%d ”,i);

第4行代码中,printf()函数的输出表列是多个表达式,而且都是自增运算符的后置运算,还是遵循“先用后变”的原则,只是这里的“先用”是一直计算完printf()函数的所有输出列表,“后变”则是指printf()函数输出结果后再改变i的值,所以第4行的输出结果为:8,8,8,8,8,8。而第5行i的值应是从8自增6次后的值14,所以第5行的输出结果为14。第7行代码中,printf()函数的输出表列是多个前置运算表达式,我们遵循“先用后变”的原则,但这时要注意printf()函数的计算参数顺序是从右至左,而输出时则是从左至右输出,所以第7行输出结果是:14,13,12,11,10,9。第8行输出结果为14。

从这个例子分析得出:printf()函数的参数中若有自增(自减)运算符的表达式,我们一定要注意:若是前置运算,例如i++或i--时,i的值是在printf()函数执行之后才被刷新,所以在printf()函数中,i++或i--对i的值暂时不产生影响;若是前置运算,例如++i或--i时,i的值在printf()函数执行之前改变,但计算顺序是从右至左,输出时仍按从左至右输出结果。

2.4自增(自减)运算符在指针中的应用

C语言中规定,当指针p指向一串连续的存储单元时,可以对指针p进行自增或自减运算,这种操作称为指针的移动,例如p++或p--,都可以使指针移动,p++是表示指针下移一个数据,即指向下一个元素,p--是表示指针上移一个数据,即指向上一个元素,而不是将p的值直接增1或减1,既然是表示指向下一个元素或上一个元素,那么就要求这一系列元素必须在内存中连续存储,所以通常p++或p--只能在数组中讨论,而且我们还要小心p++,p--不能超出数组的上下限[4]。

例4阅读以下程序,分析运行结果

#include<stdio.h>

void main()

{int *p,a[10]={1,2,3,4,5,6,7,8,9,10};

for(p=&a[9];p>=a;p--)

printf(“%d,”,*p);

第4代码中,p的初值是指向a[9]这个元素,然后输出a[9],接着p指向上一个元素a[8],然后又输出a [8],直到输出a[0]为止,所以以上程序结果为:10,9,8,7,6,5,4,3,2,1。

3 结语

自增(自减)运算符在C语言编程过程中运用频率很高,对于初学者来说既是重点又是难点,在不同的使用形式中,分析思路略有不同,要求使用者倍加小心,灵活运用。

参考文献:

[1]周伟.C语言中自增(自减)运算符教学探究[J].软件导刊,2012(12).

[2]董汉丽.C语言程序设计[M].第6版.大连:大连理工出版社,2013.

[3]李彩玲.C语言中自增自减运算符的应用与解析[J].晋城职业技术学院学报,2013(3).

[4]谭浩强.C程序设计[M].第4版.北京:清华大学出版社,2010.

The operators of C language are rich,its increment(decrement)operator is distinctive and frequently used in C language,for new leaners and beginners,it is most difficult part to get understood and easy to make mistake.Considering the basic characteristics of the increment (decrement)operator,and followed by many years of experience from teaching and practical application in VC6.0 environment,start from the real and alive example,go through from easy to difficult and step by step,and summarize a variety of different solving problem solution,which can bring the help to new leaners and beginners great help to understand and know well of increment(decrement)operator.

Keywords:

C Language;Operators;Increment(Decrement)Operators

Application and Analysis of Increment(Decrement)Operator in C Language

KAN Tian-yu
(Department of Information Technology,Guangdong Nanfang Vocational College,Jiangmen 529000)

Abstract:

C语言中运算符非常丰富,自增(自减)运算符是C语言中比较有特色而且使用频率较高的运算符之一,对于初学者来说,也是最难理解而又最容易出错的运算符。根据自增(自减)运算符的基本特点,再结合多年教学和使用经验,以VC6.0为运行环境,从示例入手,由浅入深,总结出多种不同使用形式中的不同解题思路,希望为初学者学习自增(自减)运算符带来帮助。

文章编号:1007-1423(2016)15-0040-04

DOI:10.3969/j.issn.1007-1423.2016.15.011

作者简介:

阚钿玉(1979-),女,湖北通山人,硕士,研究方向为软件工程、电子商务及高职教育学理论

收稿日期:2016-03-15修稿日期:2016-05-10

猜你喜欢

运算符表达式C语言
老祖传授基本运算符
基于Visual Studio Code的C语言程序设计实践教学探索
一个混合核Hilbert型积分不等式及其算子范数表达式
表达式转换及求值探析
用手机插头的思路学习布尔运算符
51单片机C语言入门方法
浅析C语言运算符及表达式的教学误区
基于C语言的计算机软件编程
高职高专院校C语言程序设计教学改革探索
议C语言中循环语句