一、算数操作符
+ - * / %
(1)对于 / 操作符如果两个操作数都为整数,执行整数除法。而只要有浮点数执行的就是浮点数除法
二、移位操作符
<< 左移操作符
>> 右移操作符
(1)移位操作符的操作数只能是整数。
(2)移动的是二进制位
整数的二进制表示形式有三种:
原码、反码、补码
原码:
(1) 按照数值正负,直接写出的二进制序列
(2) 对于无符号整数来说,符号位为1表示负数、0表示正数
对于无符号整数来说,没有符号位(unsigned int)
反码:
原码符号位不变,其他位置按位取反
补码:
(1) 反码的二进制+1
(2) 整数在内存中存储的是补码,计算的时候使用的也是补码
(3) 减一取反得到原码
(对于正的整数:原码、反码、补码相同)
(对于负的整数:原码、反码、补码需计算)
<<左移操作符:
二进制补码左边丢弃一位,右边空位补0(相当于乘2)
>> 右移操作符:
右移运算分两种:编译器不同,选择不同
(1) 逻辑右移
右边丢弃,左边用0填充(与左移类似)(相当于除2)
(2) 算术右移
右边丢弃,左边用原该值的符号位填充
与原正负相同
三、位操作符:
& 按位与:
对应二进制补码中,两个同时为1才为1(0大)
| 按位或:
对应二进制补码中,两个同时为0才为0(1大)
^ 按位异或:
相同为0,相异为1
a^a=0
a^0=a
操作数必须是整数
不创建临时变量(第三个变量),实现两个数的交换
编写代码实现:求一个整数存储在内存中的二进制中1的个数
一个整数在内存中有32比特位
&1能得到最低位
>>1
(作业)
四、赋值操作符:
五、复合赋值符
+= -= *= /= %= >>= &= |= ^=
六、单目操作符(只有一个操作符)
! 逻辑反操作
- 负值
+ 正值
& 取地址
* 间接访问操作符(解引用操作符)
sizeof 操作数的类型长度(以字节为单位)
(1)sizeof 是在计算类型创建变量或者变量的大小,单位是字节
(2)sizeof 计算的结果是size_t 类型,是无符号整型的,对size_t 类型的数据进行打印,可以使用%zd
(3)sizeof 后面的括号在括号中写的不是类型的时候,括号可以省略,说明sizeof不是函数,而是操作符 - 单目操作符
~ 对一个数的二进制按位取反
-- 前置、后置--
++ 前置、后置++
对本身无影响,都是自增1,但是对被赋值的数有影响,前置为自增后的值,后置为原值
(类型) 强制类型转换
七、条件操作符
exp1 ? exp2 : exp3
唯一的一个三目操作符
八、逗号表达式
exp1, exp2, exp3, …expN
逗号表达式,从左向右依次执行。整个表达式的结果是最后一个表达式的结果
九、访问一个结构的成员
. 结构体.成员名
-> 结构体指针->成员名
十、表达式求值
隐式类型转换
整型提升(类型<=int)
char short
表达式中的字符和短整型操作数在使用之前被转换为普通整型
int - signed int、unsigned int
char 到底是signed char还是unsigned char是不确定的,C语言标准没有明确指定,是取决于编译器的
在当前使用的VS上,char == signed char
实例2中的,c只要参与表达式运算,就会发生整形提升,表达式 +c ,就会发生提升,所以 sizeof(+c) 是4个字节
表达式 -c 也会发生整形提升,所以 sizeof(-c) 是4个字节,但是 sizeof(c) ,就是1个字节
算术转换(类型>=int)
如果某个操作符的各个操作数属于不同的类型,那么除非其中一个操作数的转换为另一个操作数的类型,否则操作就无法进行
寻常算术转换
long double
double
float
unsigned long int
long int
unsigned int
int
从下往上转换(下小上大)
十一、操作符的属性
一些问题表达式
a*b + c*d + e*f
c + --c;