Hello,我们又见面了,最近不知道大家是否在持续输出代码呢?代码能力是否提高了呢?今天让我们来一起学习操作符,操作符在我们学习语言中很重要,我们要知道每个操作符的作用和用法,下面开始我们的学习。
- 操作符分类:
算术操作符
移位操作符
位操作符
赋值操作符
单目操作符
关系操作符
逻辑操作符
条件操作符
下标引用、函数调用和结构成员
2算数操作符
+ - * / % • 1
加(+) 减(-) 乘(*)和数学的一样,和大家讲一讲除(/)和取模(%)的用法。
#include<stdio.h> int main() { float a = 5 / 2; printf("%f", a); return 0; }
我们可以看到虽然是浮点型,但是求出来的不是我们想要结果,这是为什么呢
原因是我们要求小数点的后面位的时候,5和2必须要有一个小数,比如5.0或者2.0,让我们加上看一看结果吧
#include<stdio.h> int main() { float a = 5 .0/ 2; printf("%f", a); return 0; }
还有我们的取模符号
首先取模符号左边和右边必须是整型,结果是余数
#include<stdio.h> int main() { int a = 9 % 2; printf("%d", a); return 0; }
这样写就对了
1. 除了 % 操作符之外,其他的几个操作符可以作用于整数和浮点数。
2. 对于 / 操作符如果两个操作数都为整数,执行整数除法。而只要有浮点数执行的就是浮点数除法。
3. % 操作符的两个操作数必须为整数。返回的是整除之后的余数。
3. 移位操作符
在讲位移操作符的时候我们得先了解一个东西,那就是二进制,因为我们的移位操作符操作的是二进制的补码
我们的整数是可以用二进制来表示的,整数的二进制有三种表达形式,分别是
原码
反码
补码
其中正数的二进制,反码补码原码都相等,但是负数的不相等
负整数数的反码是原码符号位不变,其余按位取反,补码是反码加1
下面举几个例子来让大家更好的了解二进制
大家可能对二进制的计算不是特别明白,但是大家肯定知道十进制,十进制就是我们生活中常用的数字,满十进一位,就像9到10一样,那我们的二进制也是一样,满2就往前进一位,比如111就是十进制的7
计算结果就是我们常用的十进制
我们简单了解二级制位,那么让我们来看一看原码反码补码
正整数的原码反码补码是一样的,比如5的原码是
00000000000000000000000000000101 原码
00000000000000000000000000000101 反码
00000000000000000000000000000101 补码
而我们的位移操作符是对二进制的补码进行操作的
左移操作符<<
#include<stdio.h> int main() { int a = 5<<1; printf("%d", a); return 0; }
学会正整数的左移操作符,让我们来学习一下负数的吧
#include<stdio.h> int main() { int a = -5 << 1; printf("%d", a); return 0; }
这样解释大家一定明白了吧,所以左移的规则是右边舍弃,左边加0。
右移操作符>>
右边操作符和左移也差不多
- 逻辑移位
左边用0填充,右边丢弃 - 算术移位
左边用原该值的符号位填充,右边丢弃
下面举个例子
#include<stdio.h> int main() { int a = 5 >> 1; printf("%d", a); return 0; }
算数移位的右边是加符号位
补充:补码变成反码也可以先取反然后加1,符号位不变
警告:对于移位运算符,不要移动负数位,这个是标准未定义的。
int num = 10; num>>-1;//error
4. 位操作符
& //按位与 | //按位或 ^ //按位异或
首先他们操作的都是整数
- 按位与&
#include<stdio.h> int main() { int a = 5 & 3; printf("%d", a); return 0; }
这里的按位与我们可以这样理解,首先我们要把他们的二进制位都写出来,就像上面的一样然后对齐,有一个0的结果就是0,全部为1的才是1。
- 按位或|
#include<stdio.h> int main() { int a = -1|3; printf("%d", a); return 0; }
所以按位或是有一个1就是1
- 按位异或
#include<stdio.h> int main() { int a = -1^3; printf("%d", a); return 0; }