操作符详解
操作符
- 算术操作符
- 移位操作符
- 位操作符
- 赋值操作符
- 单目操作符
- 关系操作符
- 逻辑操作符
- 条件操作符
- 逗号表达式
- 下标引用,函数调用,结构成员
算术操作符
- 加 减 乘 除 取余
- 1.除了%操作符之外,其他的几个操作符可以作用于整数和浮点数
- 2.对于/操作符必须为整数,执行整数除法,而只要有浮点数执行的就是浮点整除
- 3.%操作符的两个操作数必须为整数,返回的是整除之后的余数
移位操作符
右移操作符
左移操作符
- 规则:左边丢弃,右边补0
警告:对于位运算符,不要移动负数位,这个是标准未定义的,只能作用于整数,不能作用与浮点数或者double类型 - eg: int num=10;
- num>>-1;
- 这个是错误的
位操作符
按位与操作符 &
- 计算规则:只要有一个为0,就为0,两个为1,结果才为1
- 并且都是用补码进行计算,如果是负数,要先找出它的补码进行计算
按位或 |
- 计算规则:只要有一个为1就为1,两个为0,结果才为0
按位异或 ^
- 计算规则:相同为0,相异为1
不使用第三变量,交换两个数
- 加减法 缺点:可能会溢出
- 乘除法 缺点:可能会溢出
- 异或法 不会溢出
统计二进制中的1的个数
- 以下只能用于正整数
- 解释:将二进制的32个比特位全部打印,然后再不断右移
赋值操作符
- 赋值操作符是一个等号,而判断是两个等号
复合操作符
- += -= >>= &= ^= *= %=
单目操作符
! | 逻辑反操作 |
---|---|
- | 负值 |
+ | 正值 |
& | 取地址 |
sizeof | 操作数类型长度 |
~ | 对一个数的二进制取反 |
– | 前置,后置– |
++ | 前置,后置++ |
* | 间接访问操作符 |
(类型) | 强制转换 |
取地址 &
sizeof 计算的是变量所占内存空间的大小
按二进制位取反 ~
++ –
强制类型转换
sizeof 练习
逻辑操作符
三目操作符
- 用三目操作符写
逗号表达式
- 逗号表达式,就是用逗号隔开的多个表达式,从左向右依次执行,整个表达式的结果是最后一个表达式的结果
下标引用,函数调用,结构成员
- 1.[]下标引用操作符
- 操作数:一个数组名+一个索引值
- 2.函数调用操作符
- 3.访问一个结构的成员
- 它本身就向内存申请了一部分空间,你也可以用指针来写
- 也可以·这样写
表达式求值
- 表达式求值的顺序一部分是由操作符的优先级和结合性决定的
- 同样,有些表达式的操作数在求值时的过程可能需要转换为其他类型
隐式类型转换
- c的整型算术运算符总是至少以缺省整型类型的精度来访问
- 为了获得这个精度,表达式中的字符和短整型操作数在使用之前被转换为普通整型,这种转换称为整型提升
如何进行整体提升??
- 整型提升是按照数据类型的符号位来提升的
整形提升规则:有符号数,高位补符号位。 无符号数,高位补0
- 例子1
- 例子二
算术转换
- 如果某个操作符的各个操作数属于不同的类型,那么除非其中一个操作数的转换为另一个操作数的类型,否则操作就无法进行。下面的层次体系成为:寻常算术转化
- long double
- double
- float
- unsugned long int
- long int
- unsigned int
- int
- 如果某个操作数的类型在上面这个列表中排名较低,那么首先要转换为另一个操作数的类型后执行运算 并且是低的转换为高的
- 注意:算数转换要合理,要不然会出问题
操作符的属性
- 1.操作符的优先级
- 2.操作符的结合性
- 3.是否控制求值顺序
*注意: 一定要保证只有唯一的一个运算顺序,不然代码就是错误的
ok see you!!!