操作符
1.算术操作符
加减乘直接跳过。
除法分为整型的出发和浮点型的除法,
(1)整形的除法
分子分母都是整型。
(2)浮点型的除法
分子或分母必须出现浮点数。
%取余
%两端都必须是整型。
2.移位操作符
移动的是二进制位,整数在计算机中的储存就是用二进制。
所以移位时,移的也是二进制的补码。
整数的二进制表示有三种, 原码,反码,补码,
正数的原反补码相同。负数的原码符号位不变,其他位 按位取反得出反码,反码加一得出补码。
整型在内存中的储存都是用二进制的补码进行存储。
(1)<< 左移操作符
左移就是左边丢弃,右边补0———左移等于乘以2。
(2) >> 右移操作符
算术右移:右边丢弃,左边补符号位。
逻辑右移:右边丢弃,左边补0。
到底是那个取决于编译器的不同,大部分位算术右移。
3.位操作符
操作的是两个整数的补码
(1) & 按(二进制)位与
只有对应二进制位都为1,才为1,其余都是0。
eg: 2&3
//2 00000000000000000000000000000010
//3 00000000000000000000000000000011
& 00000000000000000000000000000010
所以 2&3 = 2
(2)| 按(二进制)位或
只有对应二进制位都为0,才为0,其余都是1。
eg: 2|3
//2 00000000000000000000000000000010
//3 00000000000000000000000000000011
| 00000000000000000000000000000011
所以 2|3 = 3
(3)^ 按(二进制)位异或
只有对应二进制位不同为1,其余都是0。
eg: 2^3
//2 00000000000000000000000000000010
//3 00000000000000000000000000000011
^ 00000000000000000000000000000001
所以 2^3 = 1
位操作符的应用
// 不创建临时变量,交换a,b的值。
方法一
(1)a = a+b
(2) b = a-b
(3) a = a-b
三步可以交换ab的值,但存在缺陷,当a,b的值过大时,可能会导致栈溢出。
方法二
按位异或支持交换律
a^a = 0
0^a = a
所以可以借用按位异或
a = a^b
b = a^b
a = a^b
实际应用中一般使用方法一,效率高,占用空间少。并且方法二只适用整型。
(4)~ 按位取反
对一个数的二进制位 按位取反。
逻辑操作符
(1)&& 逻辑与
a && b 只有当a和b都为真时,返回真,其余返回假。
ps:当a为假时,直接返回假,并且b将不会执行
(1)|| 逻辑或
a || b 只有当a和b都为假时,返回假,其余返回真。
ps:当a为真时,直接返回真,并且b将不会执行
逗号表达式
就是用逗号隔开的多个表达式,从左到右依次执行,最后逗号表达式的结果是最后一个表达式的结果。
结构体
结构体指针->成员 = 结构体对象.成员
操作符总结:如果不能有一个确定的计算路径,那么就会存在问题。
- 表达式求值
表达式中的字符和短整型操作数在使用之前都会被转换成普通整形。
整型提升的时候高位补符号位,无符号数补0.