c++自底向上算符优先分析_运算符和表达式

几乎每一个程序都需要进行运算,对数据进行加工处理,否则程序就没有意义了。要进行运算,就需规定可以使用的运算符。C语言的运算符范围很宽,把除了控制语句和输入输出以外的几乎所有的基本操作都作为运算符处理,例如将赋值符“=”作为赋值运算符、方括号作为下标运算符等。

1、基本的算术运算符

最常见的算术运算符见下表

e7dd65e2db9f6ab756a4999672c924bd.png

2、自增、自减运算符作用是使变量的值加1或减1,例如:++i,--i(在使用i之前,先使i的值加(减)1)

i++,i--(在使用i之后,先使i的值加(减)1)

粗略地看,++i和i++的作用相当于i=i+1。但++i和i++不同之处在于++i是先执行i=i+1后,再使用i的值;而i++是先使用i的值后,再执行i=i+1.如果i的原值等于3,分析下面的赋值语句:

  • j=++i;(i的值先变成4,再赋值给j,j的值为4)
  • j=i++;(先将i的值3赋给j,j的值为3,然后i变为4)

又例如:i=3;printf("%d",++i);输出4.

若改为printf("%dn",i++);则输出3.

3、算术表达式和运算符的优先级与结合性

用算术运算符和括号将运算对象(也称操作数)连接起来的,符合C语法规则的式子,称为C算术表达式。运算对象包括常量、变量、函数等。例如下面是一个合法的C算术表达式:a*b/c-1.5+'a'.

C语言除了规定了运算符的优先级外,还规定了运算符的结合性。在表达式求值时,先按运算符的优先级顺序执行,例如先乘除后加减。如表达式a-b*c,b的左侧为减号,右侧为乘号,而乘号优先级高于减号,因此相当于a-(b*c).

如果在一个运算对象两侧的运算符的优先级相同,如a-b+c,则按规定的“结合方向”处理。C语言规定了各种运算符的结合方向(结合性),算术运算符的结合方向都是“自左向右”,即先左后右,因此b先与减号结合,执行a-b的运算,然后再执行加c的运算。

“自左至右的结合方向”又称“左结合性”,即运算对象先与左面的运算符结合。以后可以看到有些运算符的结合方向为“自右至左”,即右结合性。

4、不同类型数据间的混合运算

在程序中经常会遇到不同类型的数据进行运算,如果一个运算符的两侧的数据类型不同,则先自动进行类型转换,使二者具有同一种类型,然后进行运算。因此整型、实型、字符型数据间可以进行混合运算。规律为:

(1) +、-、*、/运算的两个数中有一个数为float或double型,结果是double型,因为系统将所有float型数据都先转换为double型,然后进行运算。

(2) 如果int型与float或double型数据进行运算,先把int型和float型数据转换为double型,然后进行运算,结果是double型。

(3) 字符(char)型数据与整型数据进行运算,就是把字符的ASCII代码与整型数据进行运算。如:12+'A',由于字符A的ASCII代码是65,相当于12+65,等于77.字符数据可以直接与整型数据进行运算。如果字符型数据与实型数据进行运算,则将字符的ASCII代码转换为double型数据,然后进行运算。

以上的转换是编译系统自动完成的,用户不必过问。

例:给定一个大写字母,要求用小写字母输出。

解题思路:前面已介绍,字符数据以ASCII码存储在内存的,形式与整数的存储形式相同。所以字符型数据和其他算术型数据之间可以互相赋值和运算。

要进行大小写字母之间的转换,就要找到一个字母的大写形式和小写形式之间有什么内在联系。实际上我们通过查找资料发现其内在规律,即同一个字母,用小写表示的字符的ASCII代码比用大写表示的字符的ASCII代码大32。例如字符'a'的ASCII代码为97,而'A'的ASCII代码为65.将'A'的ASCII代码加32,就能得到'a'的ASCII代码。有此思路就可以编写程序了。

编写程序:

#include

运行结果:

a

97

程序分析:程序第6行“c2=c1+32”,把字符变量c1的值与整数32相加。c1+32就是'A'+32,就是65+32,其值为97.将97赋给字符变量c2,在c2的存储单元中存放了97(以二进制形式存储)。

一个字符数据既可以以字符形式输出,也可以以整数形式输出。第7行的目的是以字符形式输出c2,在printf函数中指定用“%c”格式,系统会将c2变量的值97转换成相应字符'a',然后输出。最后一行的目的是以ASCII码形式输出c2的值,故指定用“%d”输出格式,得到97。

5、强制类型转换运算符可以利用强制类型转换运算符将一个表达式转换成所需类型。例如:(double)a (将a转换成double类型)(int)(x+y) (将x+y的值转换成int型)(float)(5%3) (将5%3的值转转成float型)其一般形式为:(类型名)(表达式)注意,表达式应该用括号括起来。如果写成(int)x+y,则只将x转换成整型,然后与y相加。

需要说明的是,在强制类型转换时,得到一个所需类型的中间数据,而原来变量的类型未发生变化。例如:a=(int)x

如果已定义x为float型变量,a为整型变量,进行强制类型运算(int)x后得到一个int类型的临时值,它的值等于x的整数部分,把它赋给a,注意x的值和类型都未变化,仍为float型。该临时值在赋值后就不再存在了。

从上可知,有2种类型转换,一种是在运算时不必用户干预,系统自动进行的类型转换,如3+6.5.第2种是强制类型转换。当自动类型转换不能实现目的时,可以用强制类型转换。如%运算符要求其两侧均为整型量,若x为float型,则x%3不合法,必须用(int)x%3,强制类型转换运算优先于%运算符,因此先进行(int)x的运算,得到一个整型的中间变量,然后再对3求余,此外在函数调用时,有时为了使实参与形参类型一致,可以用强制类型转换运算符得到一个所需类型的参数。

6、C运算符

除了算术运算符外,C还提供其他运算符,共有以下几类:

69e037b1f4ef455946c67066d51323f3.png

2a8449b96d3ff8f0ad0810575cfa5061.png

搜索微信公众号【balayihuier】或扫描下方二维码关注微信公众号,资深软件工程师带你手把手撸代码,从此走上人生巅峰,迎娶白富美!

8290c8d49f53d6ea38f9c27181e9cb98.png
公众号《吧啦一会儿》,带你手把手撸代码
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值