运算符与表达式讲义
一、常考的C语言运算符
1.C语言运算符简介
算术运算符:+、-、、/、%
关系运算符:>、>=、==、!=、<、<=
位运算符:>>、<<、~、&、|、^
逻辑运算符:!、||、&&
条件运算符:?:
指针运算符:&,
赋值运算符:=
逗号运算符:,
字节运算符:sizeof
强制运算符:(类型名)(表达式)
初等运算符:圆括号(())、下标运算符([ ])、及结构体成员运算符(->)
2.运算符的结合性和优先级
(1)结合性:所有单目运算符、条件运算符、赋值运算符及其扩展运算符,结合方向都是从右到左,其余运算符的结合方向是从左到右。
(2)优先级比较:初等运算符>单目运算符>算术运算符(先乘除再加减)>关系运算符>逻辑运算符(不包括“!”)>条件运算符>赋值运算符>逗号运算符
3.强制类型转换符
(1)可以利用强制类型转换运算符将一个表达式转换成所需类型
(2)一般形式:(类型名)(表达式)
4.逗号运算符和逗号表达式
(1)逗号表达式:用逗号运算符将几个表达式连接起来
(2)一般形式:表达式1,表达式2,……,表达式n
(3)求解过程:先求解表达式1,然后依次求解表达式2到表达式n的值。表达式n的值就是整个逗号表达式的值。
二、算术运算符和算术表达式
1. 基本的算术运算符
(1)分类:加法运算符或正值运算符(+)、减法运算符或负值运算符(-)、乘运算符(*)、除运算符(/)和求余运算符(%)
其中,求余运算符的两端必须是整型,其余运算符的对象可以是整型或者实型。
(2)双目运算符两边的数值类型必须一致才能进行运算,如果不一致,系统会先进行一致性转换。
转换规则:char->short->int->unsigned->long->float->double
(3)所有实数的运算都是以双精度方式进行的,若是单精度实数,则需要在尾数后面补0转换成双精度
2. 算术表达式和运算符的优先级与结合性
(1)定义:用算术运算符和圆括号将运算对象连接起来的、符合C语言语法规则的表达式。
(2)运算对象:函数、常量和变量等。
(3)运算规则:
可使用多层圆括号,但圆括号必须配对。运算时由内向外依次计算各表达式的值。
对于不同优先级的运算符,按其优先级由高到低进行运算,若优先级相同,则按结合方向进行运算。
若运算符两侧的运算对象类型不同,则先利用自动转换或者强制转换,使其类型相同然后进行运算。
3. 自增、自减运算运算符
(1)作用:自增运算符(++)使运算变量的值增1,自减运算符(–)使运算变量减1。
(2)均是单目运算符。运算对象可以是整型或者实型变量,但不可以是常量和表达式。
(3)均可作为前缀运算符,也可以作为后缀运算符构成一个表达式。
++i、–i:在使用i之前,先使i的值自增1(自减1),再使用变化后的变量值参加表达式运算。
i++,i–:i的值先参加表达式运算,再执行自增1(自减1)
(4)结合方向:自右向左
三、赋值运算符和赋值表达式
1.赋值运算符和赋值表达式
(1)“=”称作赋值运算符,作用是将一个数值赋给一个变量或者将一个变量的值赋给另一个变量,由赋值运算符组成的表达式称为赋值表达式。
(2)一般形式:变量名=表达式
赋值运算符(=)的优先级高于逗号运算符
赋值运算符(=)和等于(==)运算符有很大的差别
赋值运算符的左侧只能是变量而不能是常量和表达式。赋值运算符的右侧可以是表达式,包括赋值表达式
规定最左侧变量所得的新值就是整个赋值表达式的值
2.复合赋值运算符
在赋值运算符之前加上其他运算符可以构成复合运算符,例如,+=、-=、*=、/=、%=。
两个符号之间不可以有空格。
复合赋值运算符的优先级与赋值运算符的优先级相同。
3.赋值运算中的强制转换
如果赋值运算符两侧的类型不一致,在赋值前系统会自动先把右边的表达式求得的数值按赋值运算符左侧变量的类型进行转换(也可以用强制类型转换的方式)
四、位运算
1. C语言提供的6种位运算符
按位与(&):若两个相应的二进制位都为1,则该位的结果为1,否则为0
按位或(|):若两个相应的二进制位中有一个为1,则该位的结果为1,否则为0
按位异或(^):若两个二进制位相同,则结果为0,不同则为1
按位求反(~):按位取反,即0变1,1变0
左移(<<):将一个数的二进制位全部左移若干位
右移(>>):将一个数的二进制位全部右移若干位
2. 说明
位运算中除按位求反以外,均为双目运算符,要求两侧各有一个运算对象
运算对象只能为整型或字符型数据,不能为实型数据