自减在循环while中c语言,C语言中自增自减运算符教学探究

摘要:C语言教学中,自增自减运算符运用得非常广泛,且具有一定的使用技巧和难度。在诸多运算符中,自增自减运算符是学生最难理解和最易出错的运算符。对自增自减运算符的功能和具体应用进行探究,以期为提高C语言教学效果提供帮助。

关键词:C语言;自增自减运算符;教学效果

中图分类号:G434文献标识码:A文章编号:1672-7800(2012)012-0188-02

0引言

C语言编程设计中,若合理使用自增自减运算符,则可以节省代码,提高效率;若不能正确理解和掌握,则容易造成错误,这往往让学生初学时甚是费解。教学中,有必要对其进行细致分析,让学生理解并掌握自增自减运算符的使用方法和技巧。

1自增自减运算符基本知识

C语言程序设计中提供了两个用于变量递增和递减的特殊运算符。使单个变量的值增加1的运算符称之为自增运算符,用“++”表示;使单个变量的值减少1的运算符称之为自减运算符,用“--”表示。自增自减运算符都是单目运算符,即只能对一个对象施加运算,运算结果仍赋予该对象,即结果保存在原变量的存储单元中。例如,int i=2; i++;执行i++后,i=3。此时,原变量i存储单元中存放的值变为3。这里i++等价于i=i+1,当然,i--就等价于i=i-1。

自增自减运算符的操作对象只能是变量,而不能是常量或表达式。只要其运算的对象是标准的变量,无论是整型、实型或是枚举型均可作为运算对象,而常量和表达式无存储单元可言,自然不能做自增自减运算。例如:++n、i--合法,而++10、(i+j)++非法。因为若是常量,常量的值无法改变,无法自加1;若是表达式,如(i+j)++,假如i+j=5,自增后的值为6无变量空间可供存放,所以是非法的表达式。

自增自减运算符包括两种情形:前置式(++i,--i)和后置式(i++,i--)。前置式和后置式的含义分别为:++i:变量i先自增1,然后再使用该变量i的值;--i:变量i先自减1,然后再使用该变量i的值;i++:先使用变量i的值,然后变量i再自增1;i--:先使用变量i的值,然后变量i再自减1。即前置运算是“先变后用”,而后置运算是“先用后变”。当自增自减表达式作为单一语句出现时,二者没有区别,但把它们引用在表达式中则有明显区别。例如:{int i=9; x=i++; y=i;}的执行结果x=9,y=10,后置运算是“先用后变”。而{int i=9; x=++i; y=i;}的执行结果x=10,y=10,即前置运算是“先变后用”。 因此,自增自减运算符放在变量的前面还是后面,其运算顺序不同,运算结果也不同。

自增自减运算符按照“自右至左”的结合性进行运算,操作数只有一个,属于单目运算符,优先级为2,高于其它双目运算符和三目运算符的优先级。例如:

int main()

{ int i=10,j;

j=-i--;

printf(“i=%d,j=%d”,i,j); }

例子中j=-i--为表达式,程序执行j=(-i)--,还是执行j=-(i--)呢?这里自减运算符“--”和取反运算符“-”都为单目运算符,优先级均为2,结合方向都自右至左。C语言规定,相同优先级运算符的运算先后次序由结合方向来决定,而两个运算符都是右结合性,故表达式执行j=-(i--)操作,执行结果是:i=9,j=-10。

2自增自减运算符的应用

学生在学习自增自减运算符时,关键是要掌握前置运算符是“先变后用”,而后置运算符是“先用后变”的运算规则。

2.1赋值语句中的应用

赋值语句中,自增自减运算符若作为前置式,其运算优先级高于其它算术运算,即先按照“自右至左”的结合性进行自增自减运算,再进行其它运算;若作为后置式,其运算优先级低于其它算术运算,即先进行其它算术运算,然后再按照“自右至左”的结合性进行自增自减运算。

例1分析下面程序段运行后的输出结果。

int main()

{inti,p;

i=5; p=(i++)+(i++)+(i++); printf("p=%d,i=%d\\n",p,i);

i=5; p=(++i)+(++i)+(++i); printf("p=%d,i=%d\\n",p,i); }

分析:在第3行语句表达式p=(i++)+(i++)+(i++)中,自增运算作为后置式,其运算优先级低于其它算术运算。故变量i本身先参加算术运算,即p=5+5+5=15,再按照“自右至左”的结合性进行自增运算,即i++;i++;i++;最后i的值为8。注意,第3行语句表达式p=(i++)+(i++)+(i++),从理论上分析值应为5+6+7,而实际上各种编译器执行结果均为5+5+5。这说明后置式自增运算符“先用后变”的“变”是指在下一条语句执行前统一改变,而不是刚用完就变。该行语句等价于p=i+i+i;i=i+1;i=i+1;i=i+1。第4行语句执行的结果与编译器有关,在VC环境下表达式p=(++i)+(++i)+(++i),相当于p=(((++i)+(++i))+(++i)),计算机在计算形如p=(a+b)+(c+d)+(e+f)时,先计算(a+b)+(c+d),并把结果存储(例如:存储在p中),然后再计算p+(e+f)=p。所以,原语句等价于i=i+1;i=i+1;p=i+i;i=i+1;p=p+i;即p=7+7+8=22,最后i的值为8。但在TC环境下,表达式p=(++i)+(++i)+(++i)中自增运算作为前置式,其运算优先级高于其它算术运算。故先按照“自右至左”的结合性进行自增运算,即i++;i++;i++;i的值变为8,再进行加法运算,即p=8+8+8=24。造成上述运行结果的差异是因为高级语言的一条语句经编译解释成若干条机器指令,这若干条机器指令的执行顺序最终决定该等价语句的执行结果,而这两种编译环境执行的操作顺序是有差异的。

2.2逻辑表达式中的应用

例2分析下面程序段运行后的输出结果。

int main()

{inti=8,j=9,k=10,p;

p=i++||++j&&--k;

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

按照运算规则,自增自减运算符的优先级高于逻辑运算符的优先级,应先计算i++、++j、--k,理论上输出结果应为p=1,i=9,j=10,k=9。但实际上在VC++6.0环境下执行结果为p=1,i=9,j=9,k=10,只有变量i的值变了,而变量j、k的值未改变。因C语言对逻辑运算符执行特殊的操作,即短路特性:在一个复杂的逻辑表达式中,若前面子表达式的值能够决定整个表达式的值,则后面的子表达式不再扫描计算。这样的操作设置可以加快逻辑表达式的执行速度。该程序中i++的值为8,结果为真(1),后面逻辑运算符中先执行逻辑或(||)操作,由于先前为真,不论后面表达式的逻辑值为真还是假,结果均为真,故++j、--k不被执行。

2.3循环结构中的应用

C语言中循环结构有3种循环结构语句:while语句、do while语句、for语句。前两种语句根据条件来决定是否循环,后一种语句根据设定的次数来执行循环。不管哪一种循环,都必须有使循环趋于结束的语句,这样的语句往往由i++,i--来实现,i称之为循环变量。在循环体中不断改变循环变量的值,最终使得循环条件不成立,从而结束循环。一般for语句使用的较多,例如:for(i=1;i

2.4函数实参表达式中的应用

若自增自减运算符用于函数实参表达式,则其计算方法与作为普通语句的运算结果完全不同。在VC环境下,C语言的函数执行过程是将函数实参表达式的值按照从右至左的顺序入栈,入栈前就将函数实参表达式的值计算完毕,被调函数从栈中取出参数值使用。因此,如果函数有多个参数,则它们是按照从右至左的顺序计算。

例3分析下面程序段运行后的输出结果。

int main()

{int i=5;

printf("%d,%d,%d\\n",i,++i,--i);}

函数printf()有3个参数,按照从右至左的顺序对参数进行求值:先计算--i的值,再计算++i的值,最后计算i值;结果再从左至右输出为5,5,4。

2.5指针中的应用

在C语言中,指针使用非常灵活、方便,它既可以指向各种不同的变量,又可以指向数组、函数和文件等。指针指向一定的数据对象时,既可下移指向下一对象,又可上移指向上一对象,这时就可以通过自增自减运算符来实现,其主要作用是用来修正地址。C语言规定,引用指针变量时,必须“先定义后使用”。如果定义指针变量指向一定数据类型时,p++指向内存中下一个元素,p--指向内存中上一个元素,而不是将值简单增1或减1。p++所代表的地址实际上是(p+1)×d,d是一个数据对象所占的字节数。

例4请分析以下程序运行后的输出结果。

int main()

{int a[5]={1,2,3,4,5}; M

Abstract:

Key Words:

int *num[5]={&a[0],&a[1],&a[2],&a[3],&a[4]};

int **p,i;

p=num;

for(i=0;i

{printf("%d ",**p);

p++; }

printf("\\n"); }

程序中定义p是一个指向指针型数据的指针变量,开始时指向指针数组num的首元素num[0],又num[0]是一个指针型元素,它指向整形数组a的首元素a[0]。开始时p的值为&num[0],*p为num[0]的值,即&a[0],**p即为a[0]的值。故第一个输出的是a[0]的值1,然后执行p++,p指向下一个元素num[1],不是a[1],再输出**p,即为a[1]的值3。

3结语

以上探讨了自增自减运算符在编程语句中的多个方面应用,希望对理解和使用自增自减运算符能有所帮助。在实际教学中的难点问题还会很多,尤其是对于不同的编译系统,需要多上机操作,在实践中加以理解。当然,如果掌握了上述这些基本的应用,其它难点相对就容易解决了。通过对C语言教学中难点知识的分析和探讨,必将有助于提升课堂教学效果,从而为学生学习好这门重要的语言课程打下扎实的基础。

参考文献:

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

[2]何钦珉,颜晖.C语言程序设计[M].北京:高等教育出版社,2008.

[3]BRIAN W,KERNIGHAN,DENNIS M,et al.C语言程序设计[M].第2版.北京:机械工业出版社,2007.

[4]夏超群.浅析C语言自增自减运算符的应用[J].武汉工程职业技术学院学报,2010(3).

[5]吴琼.C语言运算符的结合性分析[J].电脑知识与技术,2007(2).

你可能感兴趣的:(自减在循环while中c语言)