1, 操作符分类
1.算术操作符
ps: /,除法操作,两边是整数得到整数,有一个是小数/两端至少有一个是浮点数。 %,取模计算余数,两边必须都为整数+,-,*,/,%
2.移位操作符,只能移正数不能太大
移(2进制)位操作符
<<左移操作符
左边丢一位左移补0,原数不变,结果左移,打印的值是原码
右移操作符>>
算术右移
右边丢弃,左边补原来的符号位
逻辑右移
右边丢弃,左边补0
整数的2进制表示形式3种
正数的原码,反码,补码相同
负数
原码,按照一个数的正负,直接写出它的二进制形式得到的就是原码
反码,符号位不变,其他位按位取反
补码,取反进一,补码取反加一可以得到原码
内存中存储2进制为补码,移位时移动的是二进制补码
3.位操作符
操作数都针对于整数(二进制位)
对应的二进制位
&按位与,有0则为0
|按位或,有1则为1
^按位异或,按二进制位,相同为0,相异为1
ps, 异或支持交换律,不会产生进位 可以支持整数不用临时变量的交换
4.赋值操作符
=,赋值
复合赋值符
+=,-=,*=,/=,%=,>>=,<<=,&=,|=,^=
a=x=y+1连续赋值可化为
x=y+1
a=x 一样的表示结果
5.单目操作符
!逻辑反操作
-负值,+正值
&取地址,常与解引用搭配使用//*pa解引用操作
sizeof操作数的 类型 长度(以字节为单位)是关键字也是操作符
sizeof不是函数,有时可以省略括号 ,sizeof内部的表达式不参与计算
~ 对一个数的二进制位按位取反,所有位都取反包括符号位
--前置后置--
++前置后置++
后置先使用在操作,前置先操作在使用
++ --有副作用会改变自己的值
*间接访问操作符,也叫解引用操作符
(类型)强制类型转换
ps,unsigned无符号数会把符号位也认为有效位 signed有符号,最高位为符号位ps,布尔类型,用来表示真假的类型
#include <stdbool.h>
_Bool flag=true
_Bool flag=false
true与false两种情况
ps,sizeof和数组
数组传参,形参可以写成数组也可以写成指针
sizeof求下列大小
int arr[10]=40
char ch[10]=10
传参后均为4或8
6.关系操作符
>,>=,<,<=,!=,==
7.逻辑操作符
&&逻辑与,并且
||逻辑或,或者
只关注真假,左边算完可以判断结果,右边不会算了
8.条件操作符
表达式1?表达式2:表达式3
1真2算3不算
1为假2不算3算
9.逗号表达式
用逗号隔开,表达式结果为最后一个表达式的结果,从左到右依次执行
10.下标引用,函数调用和结构成员
下标引用,[]
函数调用,函数名(),()为函数调用操作数
结构成员
结构体,是一种自定义类型,把多种类型聚合在一起
struct 名称
{
各种类型;
}
打印方法,结构体变量.成员名,在函数中打印用地址解引用结构体指针->成员名
* 11.表达式求值
一部分是由操作符的优先级决定的,有时操作数可能要类型转换
1>隐式类型转换
整型提升,有时表达式中的字符与短整型在使用之前会被转化为普通整形,针对于整形小于整形的类型
意义,cpu操作一般为int的长度因此先转换
整型提升补的是符号位
ps,char有符号-128到+127
无符号0到256
2>算术转换
当表达式的操作数类型不同时,除非转换为与另一个操作数相同的类型,否则无法进行
一般来说向上转换
有时会有精度丢失
3>操作符属性
相邻操作符考虑优先级,根据优先级高低计算,优先级相同,考虑结合性
确定优先级结合性,无法唯一确定计算路径,尽量避免写出有疑问的代码