第3章 运算符和表达式
运算符是指对常量或变量等操作对象进行运算所用的运算符号。运算符可以按照操作对象的数目分类,也可以按照功能来分类。表达式是变量、常量等操作对象与运算符进行结合的表达方式。C语言中,这些结合执行并产生某些计算结果。表达式可用于逻辑和数学运算,也可以作为程序控制的条件。
本章的学习重点:
◆ 运算符与表达式的分类。
◆ 算术运算符与算术表达式。
◆ 逻辑运算符与逻辑表达式。
◆ 关系运算符与关系表达式。
◆ 位运算符。
◆ 条件运算符。
◆ 强制类型转换。
3.1 运算符与表达式的分类
运算符的种类多种多样,可按照操作对象数目分类,也可按照功能分类,本书重点介绍后一种。
3.1.1 运算符的分类
按照操作对象的多少,运算符主要可分为一元运算符、二元运算符和三元运算符。例如负号(-)为一元运算符,加号(+)为二元运算符等。如表3-1所示为不同类型运算符的分类。除了这些基本运算符之外,C语言还支持复合运算符以及sizeof运算符等。
按照功能分类,运算符可分为:算术运算符、赋值运算符、逻辑运算符、关系运算符、条件运算符、位运算符、取字节数运算符等。
1. 算术运算符
与数学计算中的数学符号类似,算术运算符主要用于各类数值运算。包括加(+)、减(-)、乘(*)、除(/)、负号(-)、求余(或称模运算%)、自增(++)、自减(--)共八种。
表3-1 运算符分类
2. 赋值运算符
赋值运算符主要用于赋值操作,分为简单赋值运算符(=)、复合算术赋值运算符(+=,-=,*=,/=,%=)和复合位运算赋值运算符(&=,|=,^=,>>=,<<=)三类共十一种。
3. 逻辑运算符
逻辑运算符主要用于逻辑运算。包括与(&&)、或(||)、非(!)三种。
4. 关系运算符
关系运算符主要用于比较运算。包括大于(>)、小于(<)、等于(==)、大于等于(>=)、小于等于(<=)和不等于(!=)六种。
5. 位运算符
位运算符是指将参与运算的对象按二进制位进行运算。包括位与(&)、位或(|)、位反(~)、位异或(^)、左移(<<)、右移(>>)六种。
6. 条件运算符
条件运算符是到目前为止C语言中唯一的一个三元运算符,也称为三目运算符,用于条件求值(? :)。
7. 取字节数运算符
取字节数运算符sizeof也是C语言的一个特殊运算符,它用于计算对象(可以是常量、变量及复合数据类型等)在计算机内存中所占的字节数。有的资料也把它当作函数看待,但C语言系统中,sizeof是一个运算符。
8. 其他运算符
另外,C语言中还有逗号运算符(,)、数组下标运算符([])以及结构体成员运算符(.和→)等。
3.1.2 表达式的分类
C语言中,表达式实际上是一种有值的语法结构,它一般由运算符将变量、常量或函数返回值结合而成。通常,表达式可作为程序执行过程中的某个操作步骤,或者计算的表达形式。另外,有些表达式会生成某种类型的数值,并将该值赋给某个变量或与其他表达式进行比较等逻辑操作。表达式按照运算符的不同进行分类,主要有:算术表达式、赋值表达式、逻辑表达式和关系表达式等。
1. 算术表达式
算术表达式由算术运算符和控制运算优先级的括号连接而成。算术表达式是进行算术运算的基本表达形式。例如:
3.14159*r
(a+b)/c+d*m
其中,符号*表示算术运算“乘”,/表示算术运算“除”。
2. 赋值表达式
赋值表达式一般由赋值运算符、算术运算符和操作对象组合而成,由简单的赋值运算符“=”连接起来,一般形式为:
变量 = 表达式或数值 或者
变量1 = 变量2 = 变量3 = 表达式或数值
例如:
a = x + 12
a1 = a2 = a3 = 100
b += 12
第一个表达式表示将x+12的值赋给a,第二个表达式表示将数值100分别赋给a1,a2和a3,第三个表达式表示将b+12计算的值重新赋给b。
3. 逻辑表达式
逻辑表达式一般由逻辑运算符和操作对象组合而成,逻辑表达式是C语言中进行逻辑判断的主要表达形式,也是条件控制语句中常用的控制表达式之一。如下都是逻辑表达式:
a && b
c || d && m
!x
第一个表达式表示a和b的与运算;第二个表达式表示c和d先求或运算,然后结果再和m进行与运算;第三个表达式表示求x的非运算。
4. 关系表达式
关系表达式一般由关系运算符和操作对象组合而成,和逻辑表达式类似,关系运算符也是C语言中进行数值判断的主要表示形式,同时也是条件控制语句中应用非常广泛的控制表达形式之一。如下都是关系表达式:
a > b
c <= d
m = = n
第一个表达式表示算术关系运算,判断a是否大于b,第二个表达式判断c是否小于等于d,第三个表达式判断m和n是否相等。
5. 逗号表达式
逗号表达式由其他表达式和逗号运算符组成。逗号表达式常用于变量定义。例如:
int a, b, c;
其中a, b, c就属于逗号表达式。再如:
a = 12, b = 100, c = a+b
需要说明的是,逗号表达式的值总是等于最后一个表达式的值。例如有如下定义与赋值:
int a, b, c, sum;
sum = (a =12, b = 100, c = a+b);
赋值之后,sum的值将等于赋值号右边表达式a =12, b = 100, c = a+b的值,该表达式是逗号表达式,其值为最后一个表达式的值,即c = a+b。c = a+b是一个赋值表达式,其值为c的值,即为a加b的和112。因此sum的值为112。
6. 复合表达式
复合表达式是几种简单表达式的组合,是比较复杂的表达式,例如:
num = 12 + b + (c = 35/(d = 7))
该表达式是一个赋值表达式,但赋值号右边又是比较复杂的算术表达式。在C语言中,复合表达式应用非常广泛。