APP下载

C语言表达式运算技巧探究

2021-12-19白宗辉

电脑知识与技术 2021年32期
关键词:运算符技巧方法

白宗辉

摘要:通过具体的步骤和案例分析,详解C语言表达式的运算方法和技巧。论文的研究成果,即是表达式求解的具体思路、方法和技巧,可以为C语言学习者借鉴学习,也可以为C语言教师提供教学参考。

关键词:表达式运算;运算符;方法;技巧

中图分类号:TP311      文献标识码:A

文章编号:1009-3044(2021)32-0109-02

C语言中的表达式的类型比较多,有算术表达式,赋值表达式,条件表达式,逗号表达式,关系表达式和逻辑表达式等。每种表达式都有特定的运算符,有的有一个,有的有多个。 我们实际学习中遇到的表达式,大部分不是一种表达式,而是几种不同类型的混合表达式,表达式中更有多种不同的运算符和操作数。

因此很多学习C程序设计的学生,比较畏惧c语言表达式的运算问题,遇到之后,感觉无从下手。本文将深入探究有关c语言表达式的运算技巧问题,供C语言学习的初学者和C语言授课教师借鉴和参考。

1考虑优先级

1)定义:表达是由各种运算符和操作数组成,一个表达式中,操作数和运算符的结合先后次序是由运算符的优先级决定。不同的运算符具有不同的优先级。优先级越高,越先进行计算。

2) C运算优先级与结合性表(表一):C语言运算符的优先级共有15级,按照次序,最高的是1级,最低的是15级。

要求学生必须熟记每一种运算符的优先级。

3)应用举例。

例1,c语言表达式:-a+(a+b)/2。分析表达式后可知,表达式中优先级最高的运算符是“()”是1级,余下依次是“-”是2级,“/”是3级,“+”是4级。表达式的运算过程:

(1)求负运算符高于加法运算符,先求-a的值。

(2)括号运算符优先级高于除法优先级,求(a+6)的值。

(3)除法的优先级高于加法优先级,求(2)/2的值。

(4)求(1)+(3)的值,结算线束。

2考虑结合性

1)定义:如果运算符的优先级相同,那么运算次序由结合性决定。结合性是指操作数左右两边的两个运算符的优先级相同时,应该优先运算的方向。结合性分为左结合性即运算方向为自左至右,和右结合性即运算方向为自右至左。

具体规则可查阅表一。这就要求,学生能够像熟练掌握运算符的优先级一样,要牢记每个运算符的结合性。

2)结合性应用举例:

例2,如a、b、c、d均为整型变量,求表达式a=b=c=d=3的值。

根据运算符的结合性可知,运算符的结合方向为自右向左,变量赋值过程如下,d=3,c=d,c=3,b=c,b=3,a=b,a=3。

3及时标注变量值的变化

1)概念注释:表达式中有赋值运算符时,变量都会进行初始化赋值。但是变量的值在运算过程中是会发生变化的,每次运算时,要看变量上一次结束后的最新值。如果一直用初始化的值,那么就会出错了。

2)应用举例,

例3,已知b=10,求c语言表达式: b+=b-=b*b的值。

根据我们上面讲到的运算规则,

(1)考虑优先级,先进行b*b运算,即b*b=10*10=100,表达式b+=b-=b*b变为b+=b-=100。此时无变量值发生变化。

(2)考虑结合性:计算b+=b-=100,根据赋值运算符结合性是自右向左,先执行b-=100,相当于b=b-100=10-100= -90,此时应及时标注变量变化,即b=-90,同时表达式b==b-= 100变为b+=-90。再运算b+= -90,相当于b=b+(-90)=-90-90= -180。

在本步骤中可以注意到,变量的标注其实是伴随着优先级和结合性使用过程当中的,并不是单独地存在于某一环节。

4合理使用辅助工具“括号”

1)概念注释:虽然,我们知道在计算顺序上可以利用优先级和结合性判定c语言表达式的运算方向。但有时候在计算的时候直观性仍然很差。这时候我们可以在表达式中添加括号,来辅助我们清晰判断程序的执行方向和先后顺序。

2)应用举例

例4,b+=b-=b*b+a,共有四个运算符,我们根据运算符的优先级和结合性可以加括号如下:b+=(b-=((b*b)+a)),本表达式中共加了3个括号,第一个括号和第二个括号,是根据运算符的优先级,第三个括号是根据运算符的结合性。3个括号的辅助,即让c语言表达式的运算次序和方向变得一目了然。

3)注意点:括号的使用可以帮助我们理解表达式,切记括号的添加和使用不是随意的,括号的使用不能改变原来的运算次序和方向。

5含有逻辑运算符的表达式的求值,及表达式中变量的求值

1)逻辑与运算符的表达式。

如果表达式1&&表达式2,当表达式1的值为0时,整个表达式运算停止,不再对表达式2进行运算。如果表达式1的值为非0时,则要对表达式2进行运算。

(1)邏辑与“&&”运算符左边表达式为假。

例5,如定义:int a=0,b=2。语句1 为:a++&&b++,求语句1的值及执行语句1后a和b的值。

解:执行语句1,先判断a++是否为0,由于a为0,所以a++为0,则逻辑表达式a++&&b++的值为0,表达式运算停止,不再执行&&运算右边b++的运算。在判断a是否为非0后,a的值自增1。所以语句1执行后,表达式的值为0。同时a=1,b=2。

(2)逻辑与“&&”运算符左边表达式为真。

例6,如定义:int a=1,b=2;

a++&&b++;

求表达式a++&&b++的值,及执行该表达式后a和b的值。

解:执行表达式a++&&b++,先判断a是否为0,由于a为非0值1,所以a++为非0。故判断b是否为非0,b为非0,所以整个表达式的值为真。在判断a是否为非0后,a的值自增1,同理,在判断b是否为非零后,b自增1,所以,表达式执行完毕后,a=2,b=3。

由此可见,逻辑与表达式的运算,如果“&&”运算符左边表达式为0,则不执行逻辑与运算,运算停止,逻辑与表达式的值为假;如果“&&”运算符左边表达式为非0,则执行逻辑与运算,表达式的结果由右边表达式的值决定,右边表达式的结果为0,整个表达式为假,右边表达式的值为非0,整个表达式的结果为真。

2)逻辑或表达式的运算。

如果表达式1||表达式2,当表达式1的值为非0时,表达式停止运算;如果表达式1的值为0时,则继续执行逻辑或运算。

例7,已知a=1,b=1;

++a||++b;

求表达式++a||++b的值,及执行后a、b的值。

解:执行表达式++a||++b,根据逻辑或结合性是自左向右,所以先判断++ a的值,由于++a的值为非0,所以表达式的值为真,整个表达式停止运算。在判断++a是否为0后,a自增1。所以表达式执行结束后,a=2,b=1。

3)逻辑或与逻辑与的混合表达式。

(1)这时候要先判断逻辑或运算符左边表达式的结果,不一定先进行与运算。

例8,已知,int  a=1,b=1,c=1;

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

求表达式++a||++b&&++c的值,及执行该表达式后a、b、c的值。

解:执行表达式++a||++b&&++c,先判断++a的值,由于++a的值为非0,所以表达式的值为真,整个表达式停止运算。这时候不再执行“||”右边的表达式“++b&&++c”的运算。在判断++a是否为0后,a自增1。故表达式执行结束后,a=2,b=1,c=1。

(2)逻辑或“||”运算符的左边表达式为假,先执行逻辑与运算。

例9,已知,int  a=0,b=1,c=1;

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

求表达式a++||++b&&++c的值,及执行该表达式后a、b、c的值。

解:先判断a是否为0,由于a为0,则执行++b&&++c,判断++b不为0,执行与运算,因为++c不为0,所以逻辑与表达式为真,所以表达式a++||++b&&++c为真。同理,在执行完整个语句后,a=1,b=2,c=2。

从上面的实例中可以总结出:邏辑表达式运算时,最重要的一点是判断逻辑表达式什么时候停止运算,什么时候执行运算。并通过执行过程,可以判断出变量的值是否改变。

C语言学习者,只要在掌握c语言各类运算符的优先级和结合性基础上,参照本篇文章所讲的五个要素,多练习,多思考,多总结,就能够准确地解决各种复杂的C语言表达式的运算。而以扎实的基础,轻松跨入C语言下一阶段的学习。

参考文献:

[1] 李红卫,李秉璋.C程序设计与训练[M].3版. 大连理工大学出版社,2014.

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

[3] C/C++语言中的复合自增自减运算规则探究[J].电脑编程技巧与维护,2019(9):47-49.

[4] 基于省级创新训练平台的“C语言程序设计”教学改革与实践[J].科教导刊,2017(22):115-116.

[5] 李海丰,李俊生,谢丽霞,等."三位一体"的C语言程序设计课程教学改革实践[J].计算机时代,2019(11):93-95.

【通联编辑:唐一东】

猜你喜欢

运算符技巧方法
肉兔短期增肥有技巧
老祖传授基本运算符
用手机插头的思路学习布尔运算符
指正要有技巧
提问的技巧
可能是方法不对
用对方法才能瘦
四大方法 教你不再“坐以待病”!
捕鱼
表达式求值及符号推导