操作符介绍
算数操作符
移位操作符
位操作符
赋值操作符
单目操作符
关系操作符
逻辑操作符
条件操作符
逗号操作符
下标引用、函数调用和结构成员
算数操作符
+ - * / %
1./如果一边或两边有浮点数则结果是浮点数,否则为整数结果
2.%只能用于整数之间的运算,返回的是整除后的余数
移位操作符
左移操作符;右移操作符
操作的数必须是整数;移位 移的是二进制位。
左移:左边丢弃 右边补0
右移:分为算术移位;逻辑移位
1.算术移位:右边丢弃 左边补原符号位(0正1负)
所以-1>>1=-1
所以16>>1-8
2.逻辑移位:右边丢弃 左边补0
技巧:正数左移*2、右移/2
注:位移操作符不能移动负数位
位操作符
操作的数必须是整数;操作的是二进制位。
&按位与
|按位或
^按位异或
如果是负数就用补码进行运算
例:
按位与&:全1则1(更深入例子:编写代码实现:求一个整数存储在内存中的二进制中1的个数)
按位与|:有1则1
按位异或^:同0异1(更深入的例子:笔试:交换两个int的值,且不使用第三个变量的引入)
赋值操作符
=
注:赋值操作符可以连续使用
复合赋值符
+=
-=
*=
/=
%=
<<=
>>=
&=
|=
^=
单目操作符
只作用一个操作数
(a+b 这个“+”号将a和b联系起来了 所以是双目操作符;!a 这个“!”仅对a进行了操作 所以是单目操作符)
! 逻辑反操作
- 负值
+ 正值
& 取地址
sizeof 操作数的类型长度(以字节为单位)
~ 对一个数的二进制按位取反 注:按位取反对于负号的符号位也要取反
-- 前置、后置--
++ 前置、后置++
* 间接访问操作符(解引用操作符)
(类型) 强制类型转换
关系操作符
>
>=
<
<=
!= 用于测试“不相等”
== 用于测试“相等”
注:=是赋值 ==是相等
逻辑操作符
&& 逻辑与
|| 逻辑或
逻辑与:左边若为假 右边就不计算了
逻辑或:左边若为真 右边就不计算了
区别按位与和按位或:位:二进制位
条件操作符
exp1?exp2:exp3
相当于
例子:求最大值
逗号表达式
exp1,exp2,exp3,...expN
逗号表达式,从左向右依次执行。整个表达式的结果是最后一个表达式的结果
依次执行a=b+10=12,c=b=a+1=13
最关键的是d>0作为判断条件
相当于
下标引用、函数调用和结构成员
1.[ ]下标引用操作符
操作数:一个数组名+一个索引值
[ ]的两个操作数是arr和9
2.( )函数调用操作符
接收一个或多个操作数:第一个操作数是函数名,剩余的操作数就是传递给函数的参数
3.访问一个结构的成员
. 结构体.成员名
-> 结构体指针->成员名
表达式求值
表达式求值的顺序一部分是由操作符的优先级和结合性决定。
同样,有些表达式的操作数在求值的过程中可能需要转换为其他类型
隐式类型转换
整型提升
c的整型算术运算总是至少以缺省整型类型的精度来进行的。
为了获得整个精度,表达式中的字符和短整型操作数在使用之前被转换为普通整型,这种转换称为整型提升
整型提升的意义:表达式的整型运算要做cpu的相应运算器件内执行,cpu内整型运算器(ALU)的操作数的字节长度一般就是int的字节长度,同时也是cpu的通用寄存器的长度。因此,即使两个char类型的相加,在cpu执行时实际上也要先转换为cpu内整型操作数的标准长度。通用cpu(general-purposeCPU)是难以直接实现两个8比特字节直接相加运算(虽然机器指令中可能有这种字节相加指令)。所以,表达式中各种长度可能小于int长度的整型值,都必须先转换为int或unsignedint,然后才能送入CPU去执行运算。
这里的b和c的值被提升为普通整型,然后再执行加法运算。加法运算完成后,结果将被截断,然后再储存于a中。
如何进行整型提升:按照变量的数据类型的符号位提升(有符号 正补0负补1,无符号直接补0)
算术转换
如果某个操作符的各个操作数属于不同的类型 那么除非其中一个操作数的转换为另一个操作数的类型,否则操作数就无法进行。
寻常算术转换:
long double
double
float
unsiged long int
long int
unsiged int
int
如果某个操作数类型在上面这个列表排名较低,那么首先要转换为另外一个操作数的类型后执行运算(小的转换为大的)
操作符的属性
1.操作符的优先级
2.操作符的结合性
3.是否控制求值顺序
两个相邻的操作符先执行哪个?取决于他们的优先级。如果两者的优先级相同,取决于他们的结合性.