对C 语言中运算符的再认识

时间:2022-06-18 06:32:16

对C 语言中运算符的再认识

摘要:该文对C语言中的各种运算符按照其特点进行分析、归类,指出容易产生混淆的原因,给出了使用并掌握这些运算符的一些技巧。

关键词:C语言;运算符;优先级;结合性

中图分类号:TP311 文献标识码:A 文章编号:1009-3044(2013)26-5944-02

C语言的各种运算符号按照运算级别有15级,牵扯到45个左右的运算符号,他们分别处于不同的位置,发挥不同的作用,但C语言的运算符也有许多的缺陷,相同的符号有不同的含义,相似的符号不少,再加上运算级别、结合性,面对具体问题中的符号,有时还真的会不知所措。

1 C语言运算符的优先级及结合性(如下图1)

图1

按照箭头方向,(),[],·,优先级最高,可惜它们不是真正意义上的运算符。对于真正的运算符,应该从单目运算符算起,它们的优先级仅次于前者,而双目运算符的优先级低于单目运算符,条件运算符是C中唯一的三目运算符,它的运算级别比双目运算符第,但却高于赋值运算符,逗号运算符是级别最低的。在此要记住以下几点:⑴ 算术运算符比移位运算符优先级要高,而移位运算符比关系运算符要高。⑵按位运算符的优先级比关系运算符低,比逻辑运算符高。⑶所有的按位运算符优先级要比逻辑运算符高,每个“与”运算要比相应的“或”运算符优先级高,而按位异或运算符优先级介于“与”“或”间。

每个运算符都有两重身份,优先级和结合性。优先级体现一个不含括号的表达式中运算符之间的“紧密”程度,决定了他的运算顺序。例如,在表达式a*b+c,先执行a*b,而不是b+c.但当运算符的优先级相同时,结合性就起仲裁的作用,由它决定哪个运算符先执行。

例如,int a,b=1,c=2;

a=b=c /* 赋值运算符为右结合性,因此a的值为2 */

对运算符结合性的记忆,要注意以下两点:⑴ 所有的单目运算符为右结合性。⑵所有赋值运算符都为右结合性,其余双目运算符都皆为左结合性。

2 “木—林”型运算符

C语言也是在不断的改进过程中发展的成今天的ANSI C。“林”型符号的出现(见表1),有其历史原因,但每个符号在今天的C中都有自己的使命。需要注意的是:在使用“林”型符号时,中间一定不能嵌有空白(空格符、制表符和换行符)例如,==是单个符号,而= =则是两个符号。

失之毫厘,差之千里。在以上运算符中,相似的面孔,不同的作用。如果你出现误操作,误判断,张冠李戴,系统编译却正常通过,不会出现错误提示,但程序的原意已经改变,运行结果自然已经不是初衷。例如:

while (c=’’|| c==’\t’||c==’\n’)

c=getc(f);

此循环语句的本意是跳过文件中的空格符、制表符和换行符,但由于程序员误将比较运算符==写成了赋值运算符=。因此实际上是将表达式 ’’|| c==’\t’||c==’\n’赋给了c,这样形成死循环。对于这类“木-林”型运算符,在编程过程中为了避免出现的误操作,建议可以多加注释部分,虽看似麻烦,但可以提示操作者避免误写,也为程序查错提供帮助。

3 运算符的重载

重载——作用于不同类型的同一操作具有相同的名字。在C语言中,许多运算符号被重载,在不同的上下文环境中有不同的意思。这些符号容易混淆,产生歧义。(如下表)

让一个符号所表达的意思越多,编译器就越难检测到这个符号在使用中所存在的异常情况。这是C语言自身的缺陷。为了避免这种歧义性的产生,在编程时,多使用()、空格和注释,在阅读程序或查错时,一定要根据上下语句之间的关系来具体问题具体分析。才能准确的理解它。例如:

y=x/*p;

此语句程序员本意是用x除以p所指的值后将所得的商赋给变量y,而实际上,/*被编译器理解为一段注释的开始。因此上面的语句执行结果将x赋值给了y.要语句含义表达清楚,可以将上面的语句给为y=x/(*p) 或者y=x/ *p均可。对于y=x/ *p,最好还加上注释写成:

y=x/ *p; /* p指向除数 */

4 小结

虽然每个运算符都有自己的位置、作用和运算规则,但只要掌握优先级的普遍规律,根据其结合性,注意做到在编程时避免产生歧义性。就可以写出正确的C语句。

参考文献:

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

[2] Peter Van Der Linden. C专家编程[M]. 徐波, 译. 北京: 人民邮电出版社,2010.

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

[4] Andrew Koenig. C陷阱与缺陷[M]. 高巍, 译. 北京:人民邮电出版社,2008.

上一篇:“理实一体化”教学在电类课程中的应用 下一篇:采用Visual FoxPro 制作的股票分析系统