运算符和表达式还有数据类型转换
C语言中运算符和表达式数量之多,在其他高级语言中是很少见的。正是因为丰富的表达上和运算符使得C语言功能算法完善,这也是C语言的特点之一。
2.5.1 赋值运算符和赋值表达式
C语言中赋值运算符有“=”、“+=”、“-=”、“*=”、“/=”、和“%%=”等。
1.简单的赋值运算符
简单的赋值运算符结束“=”,它的作用就是将一个数值赋给一个变量。
2.复合赋值运算符
在简单的赋值运算符前面加上算术运算符就构成了复合赋值运算符,如下图所示:
运算符 | 应用举例 | 等价形式 |
+= | a+=x | a=a+(x) |
-= | a-=x | a=a-(x) |
*= | a*=x | a=a*(x) |
/= | a/=x | a=a/(x) |
%%= | a%%=x | a=a%%(x) |
3.赋值表达式
在C语言中,赋值语句属于表达式语句。赋值表达式是由赋值运算符将一个变量和一个表达式连接起来的式子所组成。它的一般形式为
变量=表达式
由于赋值表达式的作用是将一个表达式的值赠给一个变量,因此赋值表达式具有计算和赋值的双重功能。需要注意:赋值运算符的左侧必须是一个变量。
2.5.2 算术运算符和算术表达式
1.基本的算术运算符
算术运算符包括加、减、乘、除和求余等运算,其中加、减、乘、除和求余运算均为双目运算符,所谓双目运算符是指运算时需要两个操作数。
运算符 | + | - | * | / | %% |
名称 | 加 | 减 | 乘 | 除 | 求余 |
(1)+加法运算符,为双目运算符,其功能是进行求和运算,如3+4的值为7。
(2)一作为单目运算符使用时,是取负运算,如一3;作为双目运算符使用时,是进行求差运算,如3-4的值为一1。
(3)* 乘法运算符,为双目运算符,功能是进行求乘积运算,如3*4的值为12。
(4)/ 除法运算符,为双目运算符,功能是进行求商运算,如a/b。
在计算a/b时,如果a和b都是整型,则其商也为整型,小数部分被舍去,如3/4的结果为0,4/3的结果为1。如果a和b中有一个是实型,则a和b都转换为double类型,然后相除,结果为double类型,如3. 0/2的结果为1.5。
(5)%%求余运算符,为双目运算符,功能是进行求余数的运算,如a%%b,其结果为a除以b后的余数。
求余运算要求参与运算的两个运算对象都必须是整型,其结果也是整型。如4%%3的结果为1。求余运算结果的符号与第一个操作数符号相同,如一4%%3的值为一1,4%%- 3的值为1。
2.自增、自减运算符
C语言有两个特殊运算符“++”和“--”。
(1)++自增运算符,为单目运算符,其功能是使变量的值自加1。自增运算符有两种使用形式:
①前缀方式:用于变量前面,如“int a= ++x;”它是“先计算,后使用”,即先将x的值自加1,然后将x的值赋给变量a。
②后缀方式:用于变量后面,如"inta=x++ ;”它是“先使用,后计算”,即先将x的值赋给变量a,然后再将x的值自加1。
(2)--自减运算符,为单目运算符,功能是使变量的值自减1,使用方法和自增运算符相似。
注意:自增和自减运算符的操作对象只能是一个简单变量,不能是常量或表达式,如6--、(a+b)++都是错误的。
注:两个单目运算符不能出现在同一个式子里,常量不能用自增、自减运算符。
3.算术运算符的优先级和结合性
C语言规定了运算符的优先级和结合性,单目运算符是右结合的,双目算术运算符是左结合的。算术运算符的优先级为:“++、--、-”>“*、/、%%”>“+、-”,即单目运算符的优先级高于双目运算符,双目算术运算符中*、/、%%的优先级高于+、-。在优先级相同的情况下,按规定的“结合性”进行处理。
4.算术表达式
算术表达式是由算术运算符、运算对象和括号连起来的式子,运算对象可以是常量、变量和函数等。如a+b、3*(x+y)都是算术表达式。
算术表达式使用注意:
(1)表达式中的乘号不能省略,且表达式中的所有字符均应写在同一行上。
(2)在表达式中还可以使用多层圆括号(不能使用中括号[]和花括号{}),但是要注意括号的配对。
(3)在数学中,5÷6+4的运算结果与6+4÷5的结果相同,都是7.5,但是C语言中表达式5*6/4的结果却与6/4*5的结果不一样。另外,还需注意8/(8/10)之类的表达式,因为(8/10)的结果为0,用0做除数将会出现运算溢出的错误,为了不使8/10的结果为0,应将整型常量改为实型常量8. 0/10。
2.5.3逗号运算符和逗号表达式
C语言中逗号“,”也是一种运算符,称之为逗号运算符,其功能是把多个表达式链接起来组成一个表达式,称之为逗号表达式。逗号表达式的一般形式为:
表达式1,表达式2,...,表达式n
(1)逗号表达式的执行顺序是:从左到右依次计算每个表达式的值,并把最后一个表达式的值作为整个逗号表达式的值。
如对于表达式“a=4,b=5,c=a十b”,首先计算a=4的值,结果为4,再计算b=5的值,结果为5,最后计算c=a+b的值,结果为9,则整个逗号表达式的值为9,该表达式执行完后,a=4,b=5,c=9。
(2)逗号运算符是双目运算符,其优先级最低,是左结合的。
(3)并非所有出现逗号的地方都为逗号表达式,如在变量说明语句中,以及函数参数表中逗号只是用作各变量之间的分隔符。
2.5.4求字节数运算符
运算符sizeof用于计算数据类型所占的字节数,它是一个单目运算符,优先级高于双目运算符,其一般格式如下:
(1)sizeof(表达式)或sizeof表达式
(2)sizeof(数据类型名)
2.6 数据类型转换
C语言规定,各种不同数据类型的数据在一起运算时,不同类型的数据要先转换成相同类型的数据才能进行运算。数据类型的转换可以分为自动转换和强制转换。
2.6.1自动类型转换
不同类型的数据在一起运算时,编译系统会自动进行类型转换。进行自动转换的规则是:把占用内存空间少的(低级)类型向占用空间多的(高级)类型转换,以保证运算的精度,如图2.2所示。
说明:
(1)图2.2中的横向箭头表示必定的转换,如char型、short型数据必定先转换为int型,float型数据在运算时将先转换成double型,以提高运算精度(即使是两个float 型数据相加,也要先转换成double型,然后再相加)。
(2)图2.2中的纵向箭头表示当经过横向的转换后,进
行运算的数据类型仍然不同时进行的转换方式。在不同数
据类型的转换过程中,类型转换顺序并不是按箭头方向一步-一步的转换,可以没有中间类型转换。例如int型与
double型数据进行运算,先将int型的数据直接转换成double型,然后再进行两个同类型(double型)数据的运算。
(3)数据类型的各种转换只影响表达式的运算结果,并
不改变原变量的定义类型,并且其数据值也不会发生任何
改变。
(4)当赋值运算符两边的运算对象类型不同时,也要发
生类型转换,转换的规则是:把赋值运算符右边表达式的类图2.2数据类型自动转换规则型转换为左边变量的类型。
2.6.2强制类型转换
强制类型转换是采用强制类型转换运算符将某种数据类型强制转换成指定的数据类型,其一般形式为:
(类型说明符)(表达式)
功能:把表达式的运算结果强制转换成类型说明符指定的类型。
进行强制类型转换时需注意:
(1)需强制类型转换中的表达式一定要括起来,否则只对紧随括号后的量进行类型转换。
(2)强制类型转换是一种不安全的转换,如果是从高级语言转换成低级类型,则会损失数据精度。
(3)强制类型转换并不改变表达式中变量的类型和值。