第三章 运算符与表达式
? 3,1 C运算符简介
? 运算符:狭义的运算符是表示各种运算的符号 。
? C语言运算符丰富, 范围很宽, 把除了控制语句
和输入 /输出以外的几乎所有的基本操作都作为
运算符处理, 所以 C语言运算符可以看作是操作
符 。 C语言丰富的运算符构成 C语言丰富的表达
式 ( 是运算符就可以构成表达式 ) 。 运算符丰
富, 表达式丰富, 灵活 。
? 在 C语言中除了提供一般高级语言的算术, 关系,
逻辑运算符外, 还提供赋值符运算符, 位操作
运算符, 自增自减运算符等等 。 甚至数组下标,
函数调用都作为运算符 。
第三章 运算符与表达式
? C的运算符有以下几类:
? 本章主要介绍算术运算符(包括自增自减运算
符)、赋值运算符、逗号运算符,其它运算符
在以后相关章节中结合有关内容陆续进行介绍。
++, --
第三章 运算符与表达式
? 3,2 算术运算符和算术表达式
? 1,算术运算符
? +( 加法运算符 。 如 3+5)
? -( 减法运算符或负值运算符 。 如 5-2,-3)
? *( 乘法运算符 。 如 3*5)
? /( 除法运算符 。 如 5/3,5.0/3)
? %( 模运算符或求余运算符, %要求两侧均为整型数
据 。 如 7%4的值为 3) 。
? 除了负值运算符 -单目运算符外, 其它都是双目运算符 。
? 说明,( 1) 两个整数相除的结果为整数, 如 5/3的结
果为 1,舍去小数部分 。 但是如果除数或被除数中有一
个为负值, 则舍入的方向是不固定的, 多数机器采用
,向 0取整, 的方法 ( 实际上就是舍去小数部分, 注意:
不是四舍五入 ) 。
第三章 运算符与表达式
第三章 运算符与表达式
? ( 2) 如果参加 +,-,*,/运算的两个数有一个为实数, 则
结果为 double型, 因为所有实数都按 double型进行计
算 。
? ( 3) 求余运算符 %,要求两个操作数均为整型, 结
果为两数相除所得的余数 。 求余也称为求模 。 一般情
况, 余数的符号与被除数符号相同 。
? 例如,-8%5=-3; 8%-5=3
? 2,算术表达式
? 算术表达式:用算术运算符和括号将运算对象(也称
操作数)连接起来的、符合 C语法规则的式子,称为
算术表达式。运算对象可以是常量、变量、函数等 。
第三章 运算符与表达式
? 例如, 下面是一个合法的 C算术表达式 。
? a*b/c-1.5+’a’
? 注意:
? C语言算术表达式的书写形式与数学表达式的书写形
式有一定的区别:
? ( 1) C语言算术表达式的乘号 ( *) 不能省略 。
例如:数学式 b2-4ac,相应的 C表达式应该写成,b*b-
4*a*c。
? ( 2) C语言表达式中只能出现字符集允许的字符 。
例如, 数学 πr2相应的 C表达式应该写成,PI*r*r。
( 其中 PI是已经定义的符号常量 )
? ( 3) C语言算术表达式不允许有分子分母的形式 。
例如,(a+b)/(c+d)。
第三章 运算符与表达式
? ( 4) C语言算术表达式只使用圆括号改变运算的优先
顺序 ( 不要指望用 {}[]) 。 可以使用多层圆括号, 此时
左右括号必须配对, 运算时从内层括号开始, 由内向
外依次计算表达式的值 。
? 3,( 算术 ) 运算符的优先级与结合性 (P.233附录 IV)
? C语言规定了进行表达式求值过程中, 各运算符的
,优先级, 和, 结合性, 。
? ( 1) C语言规定了运算符的, 优先级, 和, 结合性, 。
在表达式求值时, 先按运算符的, 优先级别, 高低次
序执行 。
? 如表达式,a-b*c等价于 a-(b*c),,*” 运算符优先级
高于, -”运算符 。
?
第三章 运算符与表达式
? ( 2) 如果在一个运算对象两侧的运算符的优
先级别相同, 则按规定的, 结合方向, 处理 。
? 例如,a-b+c,到底是 (a-b)+c还是 a-(b+c)? ( b
先与 a参与运算还是先于 c参与运算?)
? 查附录 IV可知,+/-运算优先级别相同, 结合
性为, 自左向右,, 即就是说 b先与左边的 a结
合 。 所以 a-b+c等价于 (a-b)+c。
? 左结合性 ( 自左向右结合方向 ),运算对象先
与左面的运算符结合 。
? 右结合性 ( 自右向左结合方向 ),运算对象先
与右面的运算符结合 。
第三章 运算符与表达式
? (3)在书写多个运算符的表达式时, 应当注意
各个运算符的优先级, 确保表达式中的运算
符能以正确的顺序参与运算 。 对于复杂表达
式为了清晰起见可以加圆括号, ( ), 强制
规定计算顺序 。
? 3,3赋值运算符和赋值表达式
? 1,赋值运算符, 赋值表达式
? 赋值运算符:赋值符号, =”就是赋值运算符 。
? 赋值表达式:由赋值运算符组成的表达式称
为赋值表达式 。 一般形式:
? 〈 变量 〉〈 赋值符 〉〈 表达式 〉
第三章 运算符与表达式
? 赋值表达式的求解过程:将赋值运算符右侧的表达式
的值赋给左侧的变量, 同时整个赋值表达式的值就是
刚才所赋的值 。 赋值的含义:将赋值运算符右边的表
达式的值存放到左边变量名标识的存储单元中 。
? 例如,x=10+y; 执行赋值运算 ( 操作 ), 将 10+y的值
赋给变量 x,同时整个表达式的值就是刚才所赋的值 。
? 说明:
? ( 1) 赋值运算符左边必须是变量, 右边可以是常量,
变量, 函数调用或常量, 变量, 函数调用组成的表达
式 。
? 例如,x=10 y=x+10 y=func()都是合法的赋值表达式 。
? ( 2) 赋值符号, =”不同于数学的等号, 它没有相等
的含义 。 (, ==”相等 ) 例如,C语言中 x=x+1是合法
的 ( 数学上不合法 ), 它的含义是取出变量 x的值加 1,
再存放到变量 x中 。
第三章 运算符与表达式
? ( 3) 赋值运算时, 当赋值运算符两边数据类型不同
时, 将由系统自动进行类型转换 。
? 转换原则是:先将赋值号右边表达式类型转换为左
边变量的类型, 然后赋值 。
? ( 1) C语言的赋值符号, =”除了表示一个赋值操作
外, 还是一个运算符, 也就是说赋值运算符完成赋
值操作后, 整个赋值表达式还会产生一个所赋的值,
这个值还可以利用 。
? 赋值表达式的求解过程是:
?l 先计算赋值运算符右侧的, 表达式, 的值
?l 将赋值运算符右侧, 表达式, 的值赋值给左侧的
变量 。
?l整个赋值表达式的值就是被赋值变量的值 。
第三章 运算符与表达式
? 例如:分析 x=y=z=3+5这个表达式 。 根据优先
级:原式 ?x=y=z=(3+5);根据结合性 (从右向
左 ),?x=(y=(z=(3+5)))?x=(y=(z=3+5))
? z=3+5:先计算 3+5,得值 8赋值给变量 z,z的
值为 8,(z=3+5)整个赋值表达式值为 8;
? y=(z=3+5):将上面 (z=3+5)整个赋值表达式值 8
赋值给变量 y,y的值为 8,( y=(z=3+5)) 整个赋
值表达式值为 8;
? x=(y=(z=3+5)):将上面 ( y=(z=3+5)) 整个赋值
表达式值 8赋值给变量,z的值为 8,整个表达式
x=(y=(z=3+5))的值为 8。
? 最后, x,y,z都等于 8
第三章 运算符与表达式
? 运算步骤:
? 序号 表达式 变量及值 表达式的值
? 1 z=3+5 z( 8) 8
? 2 y=(z=3+5) y( 8) 8
? 3 x=(y=(z=3+5)) x( 8) 8
? 将赋值表达式作为表达式的一种, 使赋值操作不仅可
以出现在赋值语句中, 而且可以以表达式的形式出现
在其它语句中 。
? 1,复合赋值运算符
? 在赋值符, =”之前加上某些运算符, 可以构成复合
赋值运算符, 复合赋值运算符可以构成赋值表达式 。
C语言中许多双目运算符可以与赋值运算符一起构成
复合运算符, 即:
? +=,-=,*=,/=,%=,<<=,>>=,&=,|=,^=
第三章 运算符与表达式
? 复合赋值表达式一般形式:
? <变量 ><双目运算符 >=<表达式 >等价于:
? <变量 >=<变量 ><双目运算符 ><表达式 >
? 例如:
? n+=1 等价于 n=n+1
? x*=y+1 等价于 x=x*(y+1) 注意:赋值运算符, 复合
赋值运算符的优先级比算术运算符低 。
? 3,赋值运算符, 赋值表达式举例
? ( 1) a=5
? ( 2) a=b=5
? ( 3) a=(b=4)+(c=3)
? ( 4) 假如 a=12,分析,a+=a-=a*a
第三章 运算符与表达式
? a+=a-=a*a?a+=a-=(a*a)?a+=(a-=(a*a))?a+=(a=a-
(a*a))?a+=(a=a-a*a)?a=a+(a=a-a*a)
自增、自减运算符,
1.作用
自增运算使单个变量的值增1,自减运算使单个变量的值
减1。
2.用法与运算规则
自增、自减运算符都有两种用法:
( 1)前置运算 ──运算符放在变量之前:++变量、--
变量
先使变量的值增(或减)1,然后再以变化后的值参与其
它运算,即先增减、后运算。
( 2)后置运算 ──运算符放在变量之后:变量++、变量-

变量先参与其它运算,然后再使变量的值增(或减)1,
即先运算、后增减。
第三章 运算符与表达式
3.说明
( 1) 自增, 自减运算, 常用于循环语句中, 使循环控
制变量加 ( 或减 ) 1, 以及指针变量中, 使指针指向
下 ( 或上 ) 一个地址 。
( 2) 自增, 自减运算符, 不能用于常量和表达式 。
例如, 5++,--(a+b)等都是非法的 。
( 3) 在表达式中, 连续使同一变量进行自增或自减运
算时, 很容易出错, 所以最好避免这种用法 。
2.8.2 逗号运算 (, ) 及其表达式
C语言提供一种用逗号运算符,,, 连接起来的式子,
称为逗号表达式 。 逗号运算符又称顺序求值运算符 。
1.一般形式
表达式1,表达式2,……,表达式 n
第三章 运算符与表达式
? 例如,3+5,6+8
2.求解过程
自左至右, 依次计算各表达式的值,, 表达式 n” 的值
即为整个逗号表达式的值 。
例如, 逗号表达式, a = 3 * 5,a * 4”的值 =60:先求解 a
= 3 * 5,得 a=15;再求 a * 4 = 60,所以逗号表达式的
值 =60。
又例如, 逗号表达式, (a = 3 * 5,a * 4),a + 5”的值 =20:
先求解 a = 3 * 5,得 a=15;再求 a * 4=60;最后求解 a
+ 5=20,所以逗号表达式的值 =20。