操作符目录
1. 算术操作符
+ - * / %
-
除了 % 操作符之外,其他的几个操作符可以作用于整数和浮点数。
-
对于 / 操作符如果两个操作数都为整数,执行整数除法。而只要有浮点数执行的就是浮点数除法。
-
% 操作符的两个操作数必须为整数。返回的是整除之后的余数。
2. 移位操作符
2.1 整数二进制的表现形式
- 有三种表现形式:原码、反码、补码
(正整数的原码、反码、补码都是相同的)
(负整数的原码、反码、补码是要计算的) - 原码:根据正负直接写出的二进制序列就是原码
(不管正整数还是负整数都可以直接写出二进制原码) - 反码:原码的符号位(0为正1为负)不变,其他的按位取反,得到的就是反码
- 补码:反码+1就是补码
(整数在内存中存储的是补码)
(计算机也是用补码计算的) - 1个整数是4个字节 = 32 bit位
正整数:10
原码:00000000000000000000000000001010
反码:00000000000000000000000000001010
补码:00000000000000000000000000001010
负整数:-10
原码:10000000000000000000000000001010
反码:11111111111111111111111111110101
补码:11111111111111111111111111110110
2.2 ‘’<<''左移操作符
<< —左移操作
- 算术左移:
将一个二进制数向左移动指定的位数,并在最低位补0。在算术左移中,符号位不变,因此可以保持负数的符号不变 - 逻辑左移:
将一个二进制数向左移动指定的位数,并在最低位补0。在逻辑左移中,符号位也会被移动,因此可能会改变负数的符号 - 左移 << 每移一位相当于乘2
警告⚠ :
对于移位运算符,不要移动负数位,这个是标准未定义的。
2.3 ">>''右移操作符
”>>"—右移操作符
- 算术右移:
将一个二进制数向右移动指定的位数,并在最高位补符号位。在算术右移中,符号位不变,因此可以保持负数的符号不变 - 逻辑右移:
逻辑右移是指将一个二进制数向右移动指定的位数,并在最高位补0。在逻辑右移中,符号位也会被移动,因此可能会改变负数的符号 - C语言中没有明月规定到时算术右(左)还是逻辑右(左),一般编译器上采用的是算术右(左)
- 右移 >> 每一移位相当于正整数除2取整(负数则取整后在减一)
警告⚠ :
对于移位运算符,不要移动负数位,这个是标准未定义的。
3. 位操作符
3.1 ‘’&''按位与
& —按位与
- 按位与:对应二进制有0则为0,俩个同时为1则为1
以上俩张图只有在计算的时候,要注意操作数的正负,原码、反码、补码和正负整数之间的关系
3.2 ‘’|''按位或
| —按位或
- 按位或:对应的二进制位有1则为1,俩个同时为0则为0
3.3 "^''按位异或
^ —按位异或
- 按位异或:对应的二进制位相同为0,相异为1
- 这里利用一个题目来促进理解:
定义俩个整型变量,并且交换俩个数的值
//这里只显示main()部分的函数内容
int main()//方法一
{
int a = 1;
int b = 2;
int tem;
//换值
tem = a;
a = b;
b = a;
printf("a=%d\n",a);
printf("b=%d\n",b);
return 0;
}
//这里只显示main()部分的函数内容
int main()//方法二
{
int a = 1;
int b = 2;
//换值
a = a + b;//将a+b(3)的值赋给a(3)
b = a - b;//用a(3)的值减b(2),得到1,再赋值给b
a = a - b;//用a(3)的值减b(1),得到2,再赋值给a
printf("a=%d\n",a);
printf("b=%d\n",b);
return 0 ;
}
这里附上方法二的结果显示:
接下来要用的就是我们刚刚学的这个"^"按位异或操作符的用法:
//这里只显示main()部分的函数内容
int main()//方法三
{
int a = 1;
int b = 2;
//换值
a = a ^ b;
b = a ^ b;
a = a ^ b;
printf("a=%d\n",a);
printf("b=%d\n",b);
return 0;
}
你可能看到一个这样的代码很蒙,别急先看代码运行结果:
//这里只拿换值部分的代码来解读
值: 3 1 2
代码: a = a ^ b
二进制 :011 001 010
//根据''^''的使用规则,可以知道a ^ b == 001 ^ 010 == 011 == 3
————————————————————————————————————————————————————————————————————
值: 1 3 2
代码: b = a ^ b
二进制 :001 011 010
//根据''^''的使用规则,可以知道a ^ b == 011 ^ 010 == 001 == 1
————————————————————————————————————————————————————————————————————
值: 2 3 1
代码: a = a ^ b
二进制 :010 011 001
//根据''^''的使用规则,可以知道a ^ b == 011 ^ 001 == 010 == 2
其实"^"按位异或在这个代码中就是一个规律:
c = a ^ b
a = c ^ b
b = a ^ c
这样理解的话是不是就简单多了呢?不急接下来还有"^"按位异或的特性没说呢
代码: b == a ^ a ^ b
二进制: | 001 001 010
过程: | |_______________| |
| | |
| 000 |
| |______________________|
| |
|——————————————————————————————————010
———————————————————————————————————————————————————————————————————
代码: b == a ^ b ^ a
二进制: | 001 010 001
过程: | |_______________| |
| | |
| 011 |
| |______________________|
| |
|——————————————————————————————————010
- 根据这个流程图,应该就可以看出:
- "^"按位异或是支持交换律的
- 俩个相等的值按位异或的话得到的一定是0
- 任何数按位异或0得到都是那个数的本身值
4. 赋值操作符
+=
-=
*=
/=
%=
>>=
<<=
&=
|=
^=
以上就是c语言中所有的赋值操作符了,具体的使用也是非常的简单:
a += b / a = a + b
a -= b / a = a - b
a *= b / a = a * b
a /= b / a = a / b
a %= b / a = a % b
a >>= b / a = a >> b
a <<= b / a = a << b
a &= b / a = a & b
a |= b / a = a | b
a ^= b / a = a ^ b
以上就是赋值操作符的用法!
5. 单目操作符
5.1 单目操作符介绍
- 单目操作符就是只有一个操作数的控制的操作符
5.1.1 "!''逻辑反操作符
!—逻辑反操作符
- 逻辑反操作符:它的作用是将一个布尔值取反,即将 true 变为 false,将 false 变为 true。(如果一下子不知道是布尔值什么意思,别急你暂时就先理解成反义词的概念,本来是"大"加个 “!” 就变成"小"的意思了,后面的小结我会解释布尔值、false、true的意思)
- 来个代码促进理解:
#include<stdio.h>
int main()
{
int num = 0;
do
{
num++;
} while (!num);//num=0,!num就不为0,反而当num不为0时,!num就为0
//应为在C语言中0为假,非0为真
printf("num = %d\n", num);
return 0;
}
代码结果为:
num = 1
- 一个代码不够那我们就再来一个:
#include<stdio.h>
int main()
{
int num = 0;
while (num != 10)//当num不等于10的时候为真就进入循环,否则退出
{
num++;
}
printf("num = %d\n", num);
return 0;