第3章运算符与表达式
本章学习目标
. 了解表达式的使用; 
. 掌握赋值运算符的使用; 
. 掌握算术运算符的使用; 
. 掌握关系运算符的使用; 
. 掌握逻辑、位逻辑运算符的使用; 
. 掌握复合运算符的使用。
每一个C语言程序都需要对不同数据类型的数据进行处理并运算,否则程序将没有任
何意义。因此,掌握C语言中各种运算符以及表达式的应用是必不可少的。本章将主要介
绍运算符以及相关表达式的使用方法,其中包括赋值运算符、算术运算符、关系运算符、逻辑
运算符、位逻辑运算符以及复合赋值运算符。
3.1 表 达 式
C语言中的表达式由操作符和操作数组成,最简单的表达式可以只有一个操作数。根
据表达式所包含操作符的个数,可以将表达式分为简单表达式和复杂表达式,简单表达式只
含有一个操作符,而复杂表达式可以包含两个或两个以上操作符。
常见的表达式如下所示。 
8 1+2 
Num1+(Num2*Num3) 
表达式本身不做任何操作,只用来返回结果值。当程序不对返回的结果值进行任何操
作时,返回的结果值不起任何作用。如上述表达式中,第一个表达式直接返回8,第二个表
达式返回1与2的和,第三个表达式返回Num1与Num2、Num3乘积的和。
表达式既可以放在赋值语句的右侧也可以放在函数的参数中。
注意: 
表达式返回的结果值是有类型的,表达式隐含的数据类型取决于组成表达式的变量和
常量的类型。
例3.1 表达式的使用。

2 5 
第3章
运算符与表达式 
1 #include <stdio.h> 
2 
3 int main(int argc, const char *argv[]) 
4 { 
5 int a, b, c; 
6 
7 a =1; 
8 b =2; 
9 /*表达式中使用变量a 加常量2*/ 
10 c =a +2; 
11 printf("c =%d\n", c); /*输出变量c 的值*/ 
12 /*表达式中使用变量b 加常量2*/ 
13 c =b +2; 
14 printf("c =%d\n", c); /*输出变量c 的值*/ 
15 /*表达式中使用变量a 加变量b*/ 
16 c =a +b; 
17 printf("c =%d\n", c); /*输出变量c 的值*/ 
18 return 0; 
19 } 
输出: 
c =3 
c =4 
c =3 
分析: 
第5行:声明变量的表达式,使用逗号通过一个表达式声明3个变量。
第7、8行:使用常量为变量赋值的表达式。
第10行:表达式将变量a与常量2相加,然后将返回的值赋值给变量c。
第11行:使用函数printf()输出变量c的值。
第13行:表达式将变量b与常量2相加,然后将返回的值赋值给变量c。
第14行:使用函数printf()输出变量c的值。
第16行:表达式将变量a与变量b相加,然后将返回的值赋值给变量c。
第17行:使用函数printf()输出变量c的值。
3.2 表达式语句
表达式组成的语句称为表达式语句,具体如下所示。 
int a =5; 
a; 
第1行代码为a赋初始值为5,同时返回a的值为5,因此“inta= 5”是一个表达式。
由于代码末尾多了一个分号,其变为一个表达式语句。第2行代码直接返回a的值5,末尾

C 语言程序设计(第2 版) 
2 6 
也多了一个分号,因此第2行代码同样是一个表达式语句。
3.3 运 算 符
C语言的运算符范围很广,将除了控制语句和输入输出以外的几乎所有的基本操作都
作为运算符处理。例如,将赋值符“=”作为赋值运算符,将方括号作为下标运算符等。本节
将介绍C语言中常用的几种运算符。
运算符用于执行程序代码运算,会针对一个以上的操作数进行运算。C语言中,常用的
运算符如表3.1所示。
表3.1 C语言常用的运算符
含 义运 算 符
算术运算符+、-、*、/、% 
自增自减运算符++、-- 
赋值运算符= 
复合赋值运算符+=、-=、*=、/=、%=、>>=、<<=、&=、|=、^= 
关系运算符>、<、==、! =、>=、<= 
逻辑运算符!、&&、|| 
位运算符~、|、^、&、<<、>> 
条件运算符?: 
逗号运算符, 
指针运算符* 
取地址运算符& 
点运算符. 
下标运算符[] 
函数调用运算符{} 
括号运算符() 
箭头运算符-> 
如表3.1所示,需要一个操作数参与的运算符称为单目运算符,如++、& 等;需要两个
操作数参与的运算符称为双目运算符,如+、*等。
3.4 赋值运算符
在C语言程序中,“=”并非等于的意思,其表示的是赋值符号,即赋值运算符,其作用
是将一个数据赋值给一个变量。在声明变量时,可以为其赋一个初始值,该初始值可以是一
个常量,也可以是一个表达式的结果,如下所示。

2 7 
第3章
运算符与表达式 
char c ='A'; 
int i =10; 
int Count =1 +2; 
如上述赋值操作,得到赋值的变量c、i、Count称为左值,其在赋值符号的左侧,产生值
的表达式称为右值,其在赋值符号的右侧。
注意: 
并不是所有的表达式都可以作为左值,如常数只可以作为右值。
在声明变量时,直接对其赋值称为赋初值,即变量的初始化。也可以先将变量声明,再
进行变量的赋值操作,如下所示。 
int i; //声明变量
i =12; //为变量赋值
3.5 算术运算符与表达式
3.5.1 算术运算符 
C语言中的算术运算符主要用来实现各种数学运算,包括两个单目运算符(正与负), 
5个双目运算符,即乘法、除法、取模、加法以及减法。算术运算符具体描述如表3.2所示。
表3.2 算术运算符
运 算 符含 义举 例结 果
- 负号运算符-2 -2 
+ 正号运算符+2 +2 
* 乘法运算符2*3 6 
/ 除法运算符5/2 2 
% 取模运算符5%2 1 
+ 加法运算符2+3 5 
- 减法运算符3-2 1 
如表3.2中,加减乘除运算符与数学中的四则运算相通,这里不再详细介绍。其中,取
模运算符%用于计算两个整数相除得到的余数。例如,5除以3的结果为1余2,求模运算
的结果为2。这里需要注意求模运算符%两侧只能是整数,结果的正负取决于被求模数(即
运算符左侧的操作数),如(-5)%3,结果为-2。取模运算符的使用如例3.2所示。
例3.2 取模运算。 
1 #include <stdio.h> 
2 
3 int main(int argc, const char *argv[]) 
4 {

C 语言程序设计(第2 版) 
2 8 
5 printf("%d\n", 5%3); 
6 printf("%d\n", (-5)%3); 
7 printf("%d\n", 5%(-3)); 
8 return 0; 
9 } 
输出: 
2-
2 
2 
分析: 
第5行:输出5除以3得到的余数。
第6行:输出-5除以3得到的余数。
第7行:输出5除以-3得到的余数。
由三次执行结果可知,取模运算结果的正负取决于被取模数(运算符左侧操作数)。
注意: 
运算符“-”作为减法运算符时,为双目运算符;作为负值运算符时,为单目运算符。
3.5.2 算术表达式
在表达式中使用算术运算符,则将表达式称为算术表达式,如下所示。 
Num =(3+5)/Rate; 
Area =Height*Width; 
需要说明的是,两个整数相除的结果为整数,如7/4的结果为1,舍去小数部分。如果
除数或被除数为负数,则采取“向零取整”的方法,即为-1,如例3.3所示。
例3.3 整数相除。 
1 #include <stdio.h> 
2 int main(int argc, const char *argv[]) 
3 { 
4 printf("%d\n", 7/4); 
5 printf("%d\n", (-7)/4); 
6 printf("%d\n", 7/(-4)); 
7 return 0; 
8 } 
输出: 
1-1 
-1

2 9 
第3章
运算符与表达式
3.5.3 算术运算符的优先级与结合性
1.算术运算符的优先级 
C语言中规定了各种运算符的优先级和结合性。对于算术运算符,表达式求值会按照
运算符的优先级高低次序执行,其中*、/、%的优先级别高于+、-的级别。例如,在表达式
中同时出现*与+,则会先运行乘法再运行加法,如下所示。 
R =x +y * z; 
在表达式中,因为*比+的优先级高,所以会先执行y*z的运算,再加x。
2.算术运算符的结合性
当算术运算符的优先级别相同时,结合方向为“自左向右”,如下所示。 
R =a -b +c; 
如上述表达式语句中,因为加法与减法的优先级别相同,所以b先与减号相结合,执行
a-b的操作,然后再执行加c的操作,该操作过程称为“自左向右的结合性”。
3.6 自增、自减运算符
C语言提供了两个用于变量递增与递减的特殊运算符,分别为自增(自加)运算符“++” 
与自减运算符“--”。自增运算符使操作数递增1,自减运算符使操作数递减1。
在C语言程序设计中,经常使用运算符++(--)来递增(递减)变量的值。其用法格
式如下所示。 
int n =0; 
n++; 
n--; 
第1行代码将n的值初始化为0。
第2行代码使用自增运算符++将n的值加1,该语句执行完毕后,n的值由0变为1。
第2行代码执行完后n的值为1,第3行代码再通过自减运算符--使n的值减少1, 
该语句执行完毕后,n的值变为初始值0。
注意: 
自增运算符++和自减运算符--只能用于变量,不能用于常量或表达式,如2++或
(a+b)--都是不合法的。因为2是常量,常量的值不能改变。(a+b)--也不可能实现, 
假如a+b的值为5,那么没有用来存放自减后的结果4的变量。
自增运算符与自减运算符可以放在变量的前面或后面,放在变量的前面称为前缀,放在
变量的后面称为后缀,具体如下所示。 
--a; //自减前缀符号
a--; //自减后缀符号
++b; //自加前缀符号
b++; //自加后缀符号

C 语言程序设计(第2 版) 
3 0 
在表达式内部,作为运算的一部分,以上两种使用方法可能有所不同。如果运算符放在
变量前,则变量在参加表达式运算之前完成自增或自减运算;如果运算符放在变量后面,则
变量的自增或自减运算在参加表达式运算之后完成。
1.前置自增、自减运算
前置自增运算符的作用是先将变量的值增加1,然后再取增加后的值;前置自减运算符
的作用是先将变量的值减少1,然后再取减少后的值。接下来通过一个示例展示前置自增
和自减运算符的作用,具体如例3.4所示。
例3.4 前置自增、自减运算。 
1 #include <stdio.h> 
2 
3 int main(int argc, const char *argv[]) 
4 { 
5 int i =0; 
6 
7 printf("i =%d\n", ++i); 
8 printf("i =%d\n", i); 
9 printf("i =%d\n", --i); 
10 printf("i =%d\n", i); 
11 
12 return 0; 
13 } 
输出: 
i =1 
i =1 
i =0 
i =0 
分析: 
第5行:将i的值初始化为0。
第7行:输出++i的值,自增运算符++放在i的前面,因此它是前置自增运算符,作
用是先将i的值增加1,再取i的值,i的初始值为0,加1后变为1,这样再输出i的值,输出
结果为1。
第8行:再次输出i的值,i的值为1,表示i的值产生变化。
第9行:输出--i的值,自减运算符--放在i的前面,因此它是前置自减运算符,作
用是先将i的值减少1,再取i的值,i的值为1,减1后变为0,这样再输出i的值,输出结果
为0。
第10行:输出i的值,i的值为0,表示i的值产生变化。
2.后置自增、自减运算
后置自增运算符的作用是先取变量的值,然后再使其值增加1;后置自减运算符的作用

3 1 
第3章
运算符与表达式
也是先取变量的值,然后再使其值减少1。接下来通过一个示例展示后置自增和自减运算
符的作用,具体如例3.5所示。
例3.5 后置自增、自减运算。 
1 #include <stdio.h> 
2 
3 int main(int argc, const char *argv[]) 
4 { 
5 int i =0; 
6 
7 printf("i =%d\n", i++); 
8 printf("i =%d\n", i); 
9 printf("i =%d\n", i--); 
10 printf("i =%d\n", i); 
11 
12 return 0; 
13 } 
输出: 
i =0 
i =1 
i =1 
i =0 
分析: 
第5行:将i的值初始化为0。
第7行:输出i++的值,自增运算符++放在i的后面,因此它是后置自增运算符,作
用是先取变量i的值执行赋值操作,再将i的值加1,i的初始值为0,先执行赋值,因此输出i 
的值为0,赋值后i的值变为1。
第8行:再次输出i的值,i的值为1,表示i的值产生变化且发生在赋值操作之后。
第9行:输出i--的值,自减运算符--放在i的后面,因此它是后置自减运算符,作
用是先取变量i的值执行赋值操作,再将i的值减1,i的值为1,先执行赋值,因此输出i的
值为1,赋值后i的值变为0。
第10行:再次输出i的值,i的值为0,表示i的值产生变化且发生在赋值操作之后。
3.7 关系运算符与表达式
在C语言中,关系运算符的作用是判断两个操作数的大小关系。
3.7.1 关系运算符
关系运算符包括大于、大于等于、小于、小于等于、等于和不等于,如表3.3所示。

C 语言程序设计(第2 版) 
3 2 
表3.3 关系运算符
符 号功 能符 号功 能
> 大于 <= 小于等于
>= 大于等于== 等于 
< 小于 ! = 不等于 
3.7.2 关系表达式
关系运算符用于对两个表达式的值进行比较,然后返回一个真值或假值(1或0)。返回
真值或假值取决于表达式中的值和运算符。真值表示指定的关系成立,假值则表示指定的
关系不正确。具体的关系表达式如下所示。 
2 >1 //2 大于1,因此关系成立,表达式的结果为真
2 >=1 //2 大于1,因此关系成立,表达式的结果为真
2 <1 //2 大于1,因此关系不成立,表达式的结果为假
2 <=1 //2 大于1,因此关系不成立,表达式的结果为假
2 ==1 //2 大于1,因此关系不成立,表达式的结果为假
2 !=1 //2 不等于1,因此关系成立,表达式的结果为真
关系运算符通常用来构造条件表达式,用在程序流程控制语句中。例如,if语句用于判
断条件而执行语句块,在其中使用关系表达式作为判断条件,如果关系表达式返回为真则执
行下面的语句块,如果关系表达式返回为假则不执行,具体操作如下所示。 
if(Num <5){ 
... //判断条件为真,则执行该代码
} 
注意: 
在C语言程序设计时,等号运算符“==”与赋值运算符“=”切勿混淆使用。
3.7.3 关系运算符的优先级与结合性
关系运算符的结合性都是自左向右。如表达式i<j<k在C语言中虽然是合法的,但
该表达式并不是测试j是否位于i和k之间,因为<运算符是左结合,所以该表达式等价于
(i<j)<k,即表达式首先检测i是否小于j,然后用比较后产生的结果(1或0)与k进行
比较。
3.8 复合赋值运算符与表达式
3.8.1 复合赋值运算符 
赋值运算符与其他运算符组合,可以构成复合赋值运算符,C语言中一共有10种复合
赋值运算符,具体如表3.4所示。

3 3 
第3章
运算符与表达式
表3.4 复合赋值运算符
运 算 符含 义举 例结 果
+= 加法赋值运算符 a+=1 a+1 
-= 减法赋值运算符 a-=1 a– 1 
*= 乘法赋值运算符 a*=1 a*1 
/= 除法赋值运算符 a/=1 a/1 
%= 取模赋值运算符 a%=1 a%1 
>>= 按位右移赋值运算符a>>=1 a>>1 
<<= 按位左移赋值运算符a<<=1 a<<1 
&= 按位与赋值运算符 a&=1 a&1 
|= 按位或赋值运算符 a|=1 a|1 
^= 按位异或赋值运算符a^=1 a^ 1 
如表3.4中,前5种用于算术运算,后5种用于位运算。
3.8.2 复合赋值表达式
本节将只介绍前面5种用于算术运算的复合赋值运算符(位运算的复合赋值运算符后
续再介绍)。
1.加法赋值运算符
加法赋值运算符即将加法运算符与赋值运算符组合,运算符表达式对应的语句如下
所示。 
a +=2; 
如上述操作语句,先将变量a加2,再将结果赋值给a。假如a的值为1,则a+=2后, 
a的值变为3。
2.减法赋值运算符
减法赋值运算符即将减法运算符与赋值运算符组合,运算符表达式对应的语句如下
所示。 
a -=2; 
如上述操作语句,先将变量a减2,再将结果赋值给a。假如a的值为3,则a-=2后, 
a的值变为1。
3.乘法赋值运算符
乘法赋值运算符即将乘法运算符与赋值运算符组合,运算符表达式对应的语句如下
所示。 
a *=2;

C 语言程序设计(第2 版) 
3 4 
如上述操作语句,先将变量a乘2,再将结果赋值给a。假如a的值为1,则a*=2后, 
a的值变为2。
4.除法赋值运算符
除法赋值运算符即将除法运算符与赋值运算符组合,运算符表达式对应的语句如下
所示。 
a /=2; 
如上述操作语句,先将变量a除以2,再将结果赋值给a。假如a的值为4,则a/=2后, 
a的值变为2。
5.取模赋值运算符
取模赋值运算符即将取模运算符与赋值运算符组合,运算符表达式对应的语句如下
所示。 
a /=2; 
如上述操作语句,先将变量a除以2,再将余数赋值给a。假如a的值为5,则a/=2后, 
a的值变为1。
接下来通过具体的示例验证上述5种复合赋值运算符,具体如例3.6所示。
例3.6 复合赋值运算符。 
1 #include <stdio.h> 
2 
3 int main(int argc, const char *argv[]) 
4 { 
5 int a =1, b =3, c =1, d =4, n =5; 
6 printf("%d\n",a +=2); 
7 printf("%d\n",b -=2); 
8 printf("%d\n",c *=2); 
9 printf("%d\n",d /=2); 
10 printf("%d\n",n %=2); 
11 
12 return 0; 
13 } 
输出: 
31221 注意: 
复合赋值运算符右侧可以是带运算符的表达式,如以下操作。

3 5 
第3章
运算符与表达式 
a *=1 +2; 
该语句等同于a=a*(1+2);,运算符*=右侧的值必须先求出,因此需要使用括号, 
而不等同于a=a*1+2;,不加括号则是另外一个结果,严重错误。
C语言采用复合赋值运算符是为了简化程序,采用复合赋值运算符的表达式计算机更
容易理解,可以提高编译效率。
3.9 逻辑运算符与表达式
3.9.1 逻辑运算符 
逻辑运算符用于表达式执行判断真或假并返回真或假。逻辑运算符有3种,具体如
表3.5所示。
表3.5 逻辑运算符
符 号功 能
&& 逻辑与 
|| 逻辑或 
! 单目逻辑非
注意: 
逻辑与运算符“&&”和逻辑或运算符“||”都是双目运算符。
3.9.2 逻辑表达式
使用逻辑运算符可以将多个关系表达式的结果合并在一起进行判断,具体如下所示。 
Result =A&&B; //当A 和B 都为真时,结果为真
Result =A||B; //A、B 其中一个为真时,结果为真
Result =!A; //如果A 为真,结果为假
一般情况下,逻辑运算符用来构造条件表达式,用在控制程序的流程语句中,如if、for 
语句等。
在C语言程序中,通常使用单目逻辑非运算符“!”将一个变量的数值转换为相应的逻
辑真值或假值(1或0),具体如下所示。 
Result =!!Value; 
3.9.3 逻辑运算符的优先级与结合性
逻辑运算符的优先级从高到低依次为单目逻辑非运算符“!”、逻辑与运算符“&&”和逻
辑或运算符“||”,这些逻辑运算符的结合性都是自左向右。
逻辑运算符的使用具体如例3.7所示。

C 语言程序设计(第2 版) 
3 6 
例3.7 逻辑运算符。 
1 #include <stdio.h> 
2 
3 int main(int argc, const char *argv[]) 
4 { 
5 int Value1, Value2; 
6 
7 Value1 =5; 
8 Value2 =0; 
9 
10 printf("Value1 && Value2 的结果是%d\n", Value1 && Value2); 
11 printf("Value1 || Value2 的结果是%d\n", Value1 || Value2); 
12 
13 printf("!!Value1 的结果是%d\n", !!Value1); 
14 return 0; 
15 } 
输出: 
Value1 && Value2 的结果是0 
Value1 || Value2 的结果是1 
!!Value1 的结果是1 
分析: 
第7行:赋值变量Value1的值为非0值。
第8行:赋值变量Value2的值为0。
Value1的值为非0(表示成立),Value2的值为0(表示不成立),因此在逻辑与表达式
中,判断为不成立(结果为0),在逻辑或表达式中,判断为成立(结果为1),Value1经过第一
次取非运算后,其值变为0,再次取非后,其值变为1。
3.10 位逻辑运算符与表达式
3.10.1 位逻辑运算符 
位逻辑运算符应用在一些特定的场合中,可以实现位的设置、清零、取反和取补操作。
位逻辑运算符包括位逻辑与、位逻辑或、位逻辑非、取补,具体如表3.6所示。
表3.6 位逻辑运算符
符 号功 能
& 位逻辑与
| 位逻辑或
^ 位逻辑非
~ 取补 

3 7 
第3章
运算符与表达式 
如表3.6所示,前三个位逻辑运算符都是双目运算符,最后一个运算符为单目运算符。
位逻辑运算符通常用于对整型变量进行位的设置、清零与取反,以及对特定位进行检测。
3.10.2 位逻辑表达式
在Linux内核驱动程序中,位逻辑运算符可以通过位操作设置寄存器中的值,操作输入
输出设备。位逻辑运算符的使用如下所示。 
Result =Value1 & Value2; 
如上述表达式语句,假设Value1、Value2为整型变量,Value1的值为5,Value2的值为
6,将Value1、Value2转换为二进制数分别为101、110。位逻辑运算即对数值的每一个对应
位执行位操作,因此执行的结果为100,转换为十进制数4。
位逻辑运算符的使用,具体如例3.8所示。
例3.8 位逻辑运算符。 
1 #include <stdio.h> 
2 
3 int main(int argc, const char *argv[]) 
4 { 
5 int Value1, Value2, Result; 
6 
7 Value1 =5; 
8 Value2 =6; 
9 
10 Result =Value1 & Value2; 
11 
12 printf("Result 的值为%d\n", Result); 
13 return 0; 
14 } 
输出: 
Result 的值为4 
3.11 运算符的优先级
在一个表达式中,可能包含有多个不同的运算符以及不同数据类型的数据对象。由于
表达式有多种运算,不同的结合顺序可能得到不同的结果甚至运算错误。因此,在表达式中
含多种运算时,必须按一定顺序进行结合,才能保证运算的合理性和结果的正确性。
表达式的结合次序取决于表达式中各种运算符的优先级,优先级高的运算符先结合,优
先级低的运算符后结合。每种同类型的运算符都有内部的运算符优先级,不同类型的运算
符之间也有相应的优先级顺序。一个表达式中既可以包括相同类型的运算符,也可以包括
不同类型的运算符。
在C语言中,运算符的优先级与结合性如表3.7所示。

C 语言程序设计(第2 版) 
3 8 
表3.7 运算符的优先级与结合性
优先级运算符名称或含义使用形式结合方向说 明
1 
[] 数组下标数组名[常量表达式] 
() 圆括号(表达式)、函数名(形参表) 
. 成员选择(对象) 对象.成员名
-> 成员选择(指针) 对象指针->成员名
自左向右
2 
- 负号运算符-表达式
(类型) 强制类型转换(数据类型)表达式
++ 自增运算符++变量名、变量名++ 
-- 自减运算符--变量名、变量名-- 
* 取值运算符*指针变量
& 取地址运算符& 变量名
! 逻辑非运算符! 表达式
~ 按位取反运算符~表达式
sizeof 长度运算符sizeof(表达式) 
从右向左
单目运算符
单目运算符
单目运算符
单目运算符
单目运算符
单目运算符
单目运算符
3 
/ 除表达式/表达式
* 乘表达式*表达式
% 取余整型表达式%整型表达式
从左向右
双目运算符
双目运算符
双目运算符
4 + 加表达式+表达式
- 减表达式-表达式
从左向右
双目运算符
双目运算符
5 << 左移变量<<表达式
>> 右移变量>>表达式
从左向右
双目运算符
双目运算符
6 
> 大于表达式>表达式
>= 大于等于表达式>=表达式
< 小于表达式<表达式
<= 小于等于表达式<=表达式
从左向右
双目运算符
双目运算符
双目运算符
双目运算符
7 == 等于表达式==表达式
! = 不等于表达式! =表达式
从左向右
双目运算符
双目运算符
8 & 按位与表达式& 表达式从左向右双目运算符
9 ^ 按位异或表达式^表达式从左向右双目运算符
10 | 按位或表达式|表达式从左向右双目运算符
11 && 逻辑与表达式&& 表达式从左向右双目运算符
12 || 逻辑或表达式||表达式从左向右双目运算符

续表

优先级运算符名称或含义使用形式结合方向说明
13 ?: 条件运算符表达式1? 表达式2:表达式3 从右向左三目运算符
= 赋值运算符变量=表达式
/= 除后赋值变量/=表达式
*= 乘后赋值变量*= 表达式
%= 取模后赋值变量%= 表达式
+= 加后赋值变量+= 表达式
14 -= 减后赋值变量-= 表达式从右向左
<<= 左移后赋值变量<<= 表达式
>>= 右移后赋值变量>>= 表达式
&= 按位与后赋值变量&= 表达式
^= 按位异或后赋值变量^=表达式
|= 按位或后赋值变量|=表达式
15 , 逗号运算符表达式,表达式,… 从左向右

3.本章小结
12 

本章主要介绍了C语言程序中常用的各种运算符以及表达式的使用。首先介绍了表
达式与运算符的概念,帮助读者了解后续章节所需的准备知识,然后分别详细介绍了赋值运
算符、算术运算符、关系运算符、复合赋值运算符、逻辑运算符、位逻辑运算符的具体使用。
不同等级的运算符具有不同的优先级以及结合性,因此在使用运算符时,需要时刻考虑,避
免因优先级问题产生不必要的错误。

3.习题
13 

1. 
填空题
(1)表达式17%3 的结果是。
(2)若inta=10;则执行a+=a-=a*a;后,a的值是。
(3)在C语言中,要求操作数都是整数的运算符是。
(4)若intsum=7,num=7;则执行语句sum=num++;sum++;++num;后sum 
的值为。
(5)若inta=6;则表达式a%2+(a+1)%2 的值为。
2. 
选择题
(1)若变量a,i已正确定义,且i已正确赋值,则以下合法的语句是( )。
i); A.a==1 B.++i; C.a++=5; D.a=int(
39
第
章

运算符与表达式


40
C语言程序设计(第2版) 

(2)在C语言程序中,运算对象必须是整型的运算符是( )。
A.%= B./ C.<= D.= 
(3)若ita7;la=5,y4.则表达式x+a%3*(nx+y)%2/4的值是
()。
n=fotx2.=7; it)
(
A.2.B.750000 3.D.0.000000


500000 2.C.500000 

(4)以下选项中,与k=n++;完全等价的表达式是( )
。
A.k=n;n=n+1; B.n=n+1;k=n;
C.k=++n; D.k+=n+1;
(5)设x和y均为int型变量,则语句x+=y;y=x-y;x-=y的功能是( )。
A. 把x和y按从大到小排列B. 把x和y按从小到大排列
C. 无确定结果D. 交换x和y中的值
(6)假设整型变量a与b被分别赋值为十进制数7与8,则执行位与操作后的结果为
( )。
A.0 B.15 C.7 D.8 
(7)以下运算符优先级最低的是( )。
A.() B.> C./ D.&& 
3. 
思考题
(1)请简述前置自加运算符与后置自加运算符的区别。
(2)请简述除法运算符与求模运算符的区别。
4. 
编程题
(1)定义一个变量a,且a的初始值为5,依次输出前置自加和后置自减的值。
(2)定义两个int型变量n和m,且设定初始值为4和8,依次输出n+=m 、n-=m 、
n*=m 、m/=n、m%=n复合赋值运算的结果。