一.操作符分类
主要介绍的有以下几种操作符:
算数操作符 单目操作符
移位操作符 关系操作符
位操作符 逻辑操作符
赋值操作符 条件操作符
二.算数操作符
算数操作符是我们比较容易理解的比如 加 + 减 - 乘 * / 除 取模%
这些操作符使用的细节得注意:
1.除了%操作符之外,其他几个操作符可以用于整数和浮点数
2.对于/操作符如果两个操作数都为整数,执行整数除法,而只要有浮点数执行的就是浮点数除法
3.%操作符的两个操作数必须为整数,返回的是整除之后的余数
当我把b赋值为浮点数的时候程序就报错,这个小点很容易忘记
三.位移操作符
左移操作符:<<
右移操作符:>>
这里的左移和右移移动是二进制位
注意:移位操作符的操作数只能是整数
3.1左移操作符
>>移位的规则是:
左边抛弃,右边补0
int main()
{
int a = 3;
//0000 0000 0000 0000 0000 0000 0000 0011
int b = a << 1;
//0000 0000 0000 0000 0000 0000 0000 0110
printf("%d\n", a);
printf("%d\n", b);
return 0;
}
此时a = 3 ,的二进制是11 ,a向左移动1,此时a变成110,b变成6
3.2右移操作符
<<移动规则:
右移分两种:
1.逻辑位移:
左边用0填充,右边丢弃
2.算数位移:
左边用丢弃的值填充,右边丢弃
4.位操作符
位操作符有:
& 按位与
| 按位或
^ 按位异或
注意:他们的操作数必须是整数
&按位与2个数都是非零才为真
int main()
{
int num1 = 3;
int num2 = -5
int sum = num1 & num2;
//按位与&
//000000000000000000000000000011 -3的补码
//100000000000000000000000000101 -5的原码
//反码符号位不变,按位取反(反码)
//111111111111111111111111111010 -5的反码
//反码+1等于补码
//111111111111111111111111111011 -5的补码
//000000000000000000000000000011 -3的补码
//000000000000000000000000000011
-5的补码和3补码按位与&
printf("%d\n" , sum);
return 0;
}
|按位与两数都为0才为0,不都为0就都为1
int main()
{
int num1 = 3;
int num2 = -5;
int sum = num1 | num2;
//按位或|
//111111111111111111111111111111011 -5的补码
//000000000000000000000000000000011 3的补码
//111111111111111111111111111111011
printf("%d\n", sum);
return 0;
}
^按位异或相同为0,相异为1
int main()
{
int num1 = 3;
int num2 = -5;
int sum = num1 ^ num2;
//111111111111111111111111111111011 -5的补码
//000000000000000000000000000000011 3的补码
//111111111111111111111111111111000
printf("%d\n", sum);
return 0;
}
有人就会问了,设计这些有什么用
当我们遇到不准许创建临时变量交换实现两个数的交换,这时我们就可以用上面的操作符
int main()
{
int a = 10;
int b = 20;
a = a ^ b;
b = a ^ b;
a = a ^ b;
//a^a = 0;
//0^a = a;
//3^3^5=5
//3^5^3 =5
//a = a ^ b;
//printf("%d %d\n", a, b);
printf("%d\n", a);
return 0;
}
5.赋值操作符
赋值操作符让之前不满意的值自己可以重新赋值
int a = 123; //原始值
a = 120; //重新赋值
赋值也可以连续使用
int a = 1;
int b = 2;
a = b = a + 1;
这种写法不够简洁
可以使用复合赋值符
+= -=....等等
int a = 1;
a = a + 1;
可以直接写成
a += 1;
6.单目操作符
! 逻辑反操作符 sizeof()
- 赋值 -- 前置 或后置 --
+ 正值 ++前置 或后置++
& 取地址 *解引用操作符
(类型)强制类型转换