《硅谷》杂志:C语言学习难点“运算符”探析 |
2014-02-24 11:53 作者:张立社 来源:硅谷网-《硅谷》杂志 HV: 编辑: 【搜索试试】
|
|
C语言的特点之一是运算符丰富,使用灵活,这恰恰也成为初学者学习C语言的难点。结合多年教学经验对C语言运算符最基本、最常用的内容进行阐述,并针对学生学习过程中容易产生疑惑的细节问题举出具体实例进行分析说明。以期对读者有所帮助。
关键词:C语言;运算符;表达式;Turbo2.0环境
0引言
C语言功能强大,使用灵活,可移植性好,数据类型和运算符丰富,语法限制不太严格,程序设计自由度大,深受广大程序开发人员的喜爱,且已成为大中专业院校理工类专业学生的必修课。
C语言中除传统的运算符之外,把括号、赋值、强制类型转换等也作为运算符处理,它共有40多个运算符,分为15个优先级,两种结合性。C语言运算符极其丰富,表达式类型也就更加多样化,从而使得运算的实现更加灵活。这就要求学生在学习过程中必须深入理解、掌握每一种运算符的功能、用法,只有这样,学生才能在以后的实践运用中少犯错误。
1C语言运算符要点
对初学者而言,在学习C语言运算符时,除了掌握每一种运算符的功能,还应从以下几个方面掌握。
1.1运算符与运算量的关系。
运算符与运算量的关系包含两个方面:一方面是运算符对运算量个数的要求,另一方面是运算符对运算量的数据类型的要求。
C语言的运算符按其要求参与运算的量的个数分为单目、双目、三目共3类。单目运算符对一个运算量进行操作,典型的单目运算符有!、++、--、-、&、~等;双目运算符要求的运算量为2个,如+、-、*、/等;三目运算符要求的运算量为3个,C语言中只有一个三目运算符,即条件运算符(?:)。
运算符对运算量的数据类型的要求。在C语言中每一种运算符都对操作数(即运算量)的类型有要求,这里列出两种经常出错的情况。
算术运算符中的求余运算符“%”,该运算符要求两侧均应为整型数据,如5%2的值为1,但如果写为5.2%2则是错误的。
自增(++)和自减(--)运算符只能作用于变量,不允许对常量、表达式或其它进行操作。例如,5++,(-i)++都错误的。
1.2运算符的优先级
运算符的优先级规定了运算符的优先次序。如前所述,C语言所有的运算符共分为15个优先级,当一个表达式中有多个运算符参加运算时,应该按C语言规定的优先级进行运算:先进行优先级高的运算,再进行优先级低的运算,同优先级的运算则要考虑运算符的结合性。
1.3运算的结合性
C语言中每个运算符拥有某一级别的优先级属性,同时也拥有结合性属性。结合性的概念在其它一些高级语言中没有的,是C语言的特点之一。
运算符的结合性是指同一优先级的运算符在表达式中操作的组织方向,即:当一个运算对象两侧运算符的优先级相同时,运算对象与运算符的的结合顺序。
C语言运算符的结合性分为两类:左结合性(自左至右的结合方向)和右结合性(自右至左的结合方向)。C语言中具有右结合性的运算符只有三种:单目运算符、赋值运算符(=)和条件运算符,其它都是左结合性。
例如,x-y+z,y两侧有+和-两种运算符的优先级相同,而它们都是左结合性,因此先让左边的“-”与运算量结合,执行x-y的运算,然后再和z相加。
又如a=b=c=2,该式中三个赋值运算符为同一优先级,但它们为右结合性,因此先让最右边的赋值号与运算量结合,执行c=2,然后将c的值赋给b,再将b的值赋给a,整个表达式相当于a=(b=(c=2)),执行的结果是三个变量的值均为2。
又如x>y?x:z>w?z:w,两个条件运算符为同一优先级,它们为右结合性,所以等同于x>y?x:(z>w?z:w)。
再如-i++,-(负运算符)和++优先级相同,而它们都是右结合性,即相当于-(i++)。
最后必须强调:结合性只用于表达式中出现两个或两个以上相同优先级的运算符符的情况,这时结合性就起仲裁的作用,用于消除歧义,由它决定同优先级的哪个运算符先执行。如果表达式中各运算符优先级均不同,是不用考虑结合性的。C语言中所有优先级相同的运算符,它们的结合性也相同。
1.4数据的类型转换
在C语言不同类型数据(如整型、实型、字符型)可以混合运算,进行混合运算的首要的问题是对参与运算的数据进行类型转换。在运算时,不同类型的数据要转换成同一类型,然后进行运算。数据类型转换的方式有两种上:一种是自动转换,另一种是强制转换。
自动转换由系统自动完成,C语言在计算该表达式时会自动将不同数据类型转换为同一种数据类型以便进行运算。转换原则由低到高为:char、short→int→unsigned→long→double←float(加粗部分仅表示转换的方向,不表示必定的转换,例如一个int型,一个long型,那么int型会直接转换为long型,而不会先转换为unsigned,再转换为long型)。例如7/2的运算结果为2,因为7和2均为整型,它们的运算结果也为整型;而7.0/2的结果为3.5,因为根据转换规则这2要先转换为实数2.0,然后相除,结果也为实数。
强制转换是利用强制类型转换运算符将一个表达式转换成所需类型,其一般形式为:(类型名)(表达式),含义是将右边表达式的值转换成括号中指定的数据类型。
1.5C语言中关于运算符的一些特殊规定
1.5.1多个运算符相连在一起的规定
C语言中有的运算符为一个字符,有的运算符由两个字符组成,在表达式中如何组合呢?如A+++B如何理解?对此,C规定:自左向右取尽可能多的符号组成运算符。A+++B此时将被解释为(A++)+B,而不是A+(++B)。
1.5.2逻辑运算中的短路规定
对逻辑运算符,C语言规定从左到右求值,并且在能确定整个表达式的值的时候就会停止,不再进行后面的计算,这就是常说的短路。C语言这样的规定是为了加快逻辑表达式的执行速度。
例如,设a=b=c=3,则执行++a||++b&&++c后a,b,c的值各为多少呢?根据上述规定,首先计算++a,a值为4,至此该表达式结果为真已经确定,则后边的计算不再执行。所以最终a=4,b=3,c=3。
又例如,a=0,b=3,c=3,则执行a&&++b&&++c后,根据规定,因a=0,已经决定该表达式值为假,后边计算不再执行。最终a=0,b=3,c=3。
1.5.3自增(++)、自减(--)运算符的规定
这两个单目运算符是使变量的值增1或减1,有前置运算和后置运算两种类型。
++i、--i;前置运算。其作用是先将变量i原来的值加1或减1,并将i的新值做为表达式的值。
i++、i--;后置运算。其作用是先将变量i原来的值做为表达式的值,最后其值再加1或减1。
这里提醒读者,++i、--i、i++、i—就是我们所说的表达式,严格区分i的值和表达式的值是正确运用自增、自减运算符的关键。
例如,设i=3,则执行y=5+i++后y和i的值为多少?首先根据优先级可知5+i++等价于5+(i++),再根据上述规定知表达式i++的值为3,所以y=8,而i最终值为4。
这里再举一特殊例子,设i=3,求表达式i+++i+++i++的值。据前面2.5.1中所述,知其等价于(i++)+(i++)+(i++)。也就是求三个i++表达式之和,那么根据上述自增、自减的运算规则,这三个表达式的值分别是3、4、5呢?还是全部为3呢?要注意的是不同的系统有不同的解释,TurboC规定把3作为表达式中所有i的值,因此3个i相加,得到表达式值为9,在求出整个表达式的值后再实现自加3次,i的值变为6。为避免出现这种岐义性,建议编程时尽可能不用这种格式。
2结束语
C语言运算符的丰富性,在带给C语言灵活性的同时,也使初学者感到较难完全掌握。如何正确地理解和熟练地使用运算符和表达式一直都是C语言初学者感到困难的一件事,在文中对C运算符做了较为详细的介绍,并且给出了一些典型的例子(Turbo2.0环境通过)。希望能对C语言初学者和任课教师有一定的启发和帮助。
参考文献:
[1]谭浩强,C程序设计(第二版)[M].北京:清华大学出版社,1999.
[2]谭雪松等,C语言程序设计[M].北京:人民邮电出版社,2011.(注:本文版权归作者本人和硅谷杂志所有,禁止他人未经授权转载)
|
|
|
|
【对“《硅谷》杂志:C语言学习难点“运算符”探析”发布评论】 |
版权及免责声明:
① 本网站部分投稿来源于“网友”,涉及投资、理财、消费等内容,请亲们反复甄别,切勿轻信。本网站部分由赞助商提供的内容属于【广告】性质,仅供阅读,不构成具体实施建议,请谨慎对待。据此操作,风险自担。
② 内容来源注明“硅谷网”及其相关称谓的文字、图片和音视频,版权均属本网站所有,任何媒体、网站或个人需经本网站许可方可复制或转载,并在使用时必须注明来源【硅谷网】或对应来源,违者本网站将依法追究责任。
③ 注明来源为各大报纸、杂志、网站及其他媒体的文章,文章原作者享有著作权,本网站转载其他媒体稿件是为传播更多的信息,并不代表赞同其观点和对其真实性负责,本网站不承担此类稿件侵权行为的连带责任。
④ 本网站不对非自身发布内容的真实性、合法性、准确性作担保。若硅谷网因为自身和转载内容,涉及到侵权、违法等问题,请有关单位或个人速与本网站取得联系(联系电话:01057255600),我们将第一时间核实处理。
|
|
|
|