【时时三省】(C语言基础)算术表达式和运算符
山不在高,有仙则名。水不在深,有龙则灵。 ----CSDN 时时三省
算术表达式和运算符的优先级与结合性
用算术运算符和括号将运算对象(也称操作数)连接起来的,符合C语法规则的式子称为C算术表达式。运算对象包括常量、变量、函数等。例如,下面是一个合法的C算术表达式:
a * b / c- 1.5 + ' a '
C语言规定了运算符的优先级(例如先乘除后加减),还规定了运算符的结合性。
在表达式求值时,先按运算符的优先级别顺序执行,如表达式a-bxc,b的左侧为减号,右侧为乘号,而乘号优先级高于减号,因此,相当于a- ( b * c )。
如果在一个运算对象两侧的运算符的优先级别相同,如a-b + c ,则按规定的“结合方向”处理。C语言规定了各种运算符的结合方向(结合性),算术运算符的结合方向都是“自左向右”即先左后右,因此b先与减号结合,执行a-b的运算,然后再执行加c的运算“自左至右的结合方向”又称“左结合性”,即运算对象先与左面的运算符结合。以后可以到有些运算符的结合方向为“自右至左”,即右结合性(例如,赋值运算符,若有a = b = c从右到左顺序,先把变量c的值味给变量b,然后把变量b的值赋给变量a)。关于“结合性的概念在其他一些高级语言中是没有的,是C语言的特点之一。
说明:不必死记,只要知道,算术运算符是自左至右(左结合性),赋值运算符是自至左(右结合性)
不同类型数据间的混合运算
在程序中经常会遇到不同类型的数据进行运算,如5 * 4.5。如果一个运算符两侧的据类型不同,则先自动进行类型转换,使二者成为同一种类型,然后进行运算。整型、实型、字符型数据间可以进行混合运算。
规律为:
( 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型数据,然后进行运算
分析下面的表达式,假设已指定i为整型变量,值为3,f为float型变量,值为2.5,d为double型变量,值为7.5。
10 + ' a ' + i*f-d / 3
编译时,从左至右扫描。
强制类型转换运算符
可以利用强制类型转换运算符将一个表达式转换成所需类型。例如:( 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型。该临时值在赋值后就不再存在了。
从上可知,有两种类型转换。一种是在运算时不必用户干预,系统自动进行的类型转换,如3 + 6.5。另一种是强制类型转换。当自动类型转换不能实现目的时,可以用强制类型转换。如%运算符要求其两侧均为整型量,若x为float型,则x% 3不合法,必须用( int ) x% 3。