目录
以上就是今天要讲的内容,本文仅仅简单介绍了一些常见操作符的使用,熟练使用操作符能让我们更快的写代码,所以多记一记吧
前言
1.各种操作符的介绍
一、操作符的分类
1、算数操作符 + (加) -(减) *(乘) /(除法取整) %(除法取模)
2、移位操作符 <<(左移) >>(右移)
3、位操作符 &(按位与) |(按位或) ^(按位异或)
4、赋值操作符 += = -= *=
5、单目操作符 ! ++ -- ~(取反) sizeof & *
6、关系操作符 < <= > >= == !=
7、逻辑操作符 && ||
8、条件操作符 exp1 ? exp2 : exp3
1.算数操作符
算数操作符:就是我们平时常用的+(加)、-(减)、*(乘)、/(除法取整)、%(除法取模)。
1.除了%(取模)操作符之外,其他的算数操作符都可以操作整数和浮点数。
2.对于/操作符来说,操作符所操作的两个数为整数,就执行整数除法,而一旦出现浮点数,就执行浮点数除法。
3.%操作符操作的两个数必须是整数,但是返回的是整除后的余数。
使用方法和我们平常一样,没有太大区别,这里和大家说一个小知识,在电脑的cpu中只有加法,那么像乘法、除法、减法是怎么完成的呢?如果你感兴趣可以看一下链接的文章。
2.移位操作符
移位操作符:<<(左移)、>>(右移),移位操作符的作用是将数值的二进制位进行移动,
(1)右移 :
#include<stdio.h>
int main()
{
int a=15;//声明变量
//00000000000000000000000000001111 ——原码
//00000000000000000000000000001111 ——反码
//00000000000000000000000000001111 ——补码
int b=a>>1;//将a的二进制向右移动一位的结果用b来接受
printf("%d\n",a);
printf("%d\n",b);
return 0;
}
那么,为什么右移一位就从15变成了7呢?
这里我们应该怎么办呢?
在C语言中有两种右移方法,
1.算数右移:右边丢弃,左边直接补符号位。
2.逻辑右移:右边丢弃,左边补0。
但是呢,我们并不知道到底是用哪一种,C语言中也没有规定,但是在编译器用一般都是采用算数右移。
注意!上面的a,b的值取正是为了方便计算,我们所有的计算都是对补码进行操作,如果对原、反、补码不知道的同学请参考下面的文章,
接下来我们来看看负数是怎么算的。
#include<stdio.h>
int main()
{
int a = -15;//声明变量
//10000000000000000000000000001111 ——原码
//11111111111111111111111111110000 ——反码
//11111111111111111111111111110001 ——补码
int b = a >> 1;//将a的二进制向右移动一位的结果用b来接受
printf("%d\n", a);
printf("%d\n", b);
return 0;
}
最后得到的a向右移动一位的值,也就是b的值,此时我们得到的是补码,将补码进行还原得到原码。
(2)左移:
相对于右移,左移要简单的多。
左移:左边丢弃,右边直接补0
这里我就不多讲了,比起右移已经更简单了,有兴趣可以下去自己试试
还有大家不要搞一下神奇的操作哈,像什么(a<<-2)的操作千万不要来理论上是可行的,但是这种操作是没有规定的,所以最好不要使用。
3.位操作符
& 按位与
| 按位或
^ 按位异或
!他们的操作数必须是整数。
位操作符也是操作二进制位,以二进制位的方式进行计算。
(1)按位与:
这里我们声明a,b,然后进行按位与操作
按位与的操作规则是:两个二进制有零则为零,两个同时为一才得一。
(2)按位或:
按位或操作符的规则是:有一则为一,两个同时为零时,结果才为0
(3) 按位异或:
按位异或:对应的二进制位,相同才为0,相异为1
了解了位操作符后,我们来看看一道题
要求:交换两个变量中的值,不能出现第三个变量
这道题我们要怎么办?平常我们都是直接创建第三个变量进行交换,但是现在不能创建变量了,怎么办?你是否联想到了位操作符?
从这里我们了解了,如果一个数异或0,那么得到的结果就是这个数,并且两个相同的数进行异或,得到的结果是0,
从这里我们又看见了a^a^b=a^b^a,所以异或操作符是支持交换率的,然后呢,看清楚这神奇的一幕
这是怎么完成的呢?
首先,a=a^b,我们将算式带入b=a^b,得到了新的算式b=a^b^b,我们又知道两个相同的数进行异或结果就是它本身,所以b ^b=b,所以b=a,我们就将a放入了b中,最后一个算式a=a^b,此时带入算式1,算式2(此时b=a),得到a=a^b^a,就这样,我们完成了交换。
4.赋值操作符
赋值操作符可以连续进行赋值
int main()
{
int a=1,b=2,c=3;
a=b=c;
return 0;
}
当然还有符合赋值操作符像*=、+=、-=之类的
5.单目操作符
! 逻辑反操作
- 负值
+ 正值
& 取地址
sizeof 操作数的类型长度(以字节为单位)
~ 对一个数的二进制位取反
-- 前置、后置减一
++ 前置、后置加一
* 间接访问操作符(解引用操作符)
(类型) 强制类型转换
6. 关系操作符
> 大于
>= 大于等于
< 小于
<= 小于等于
!= 不等于
== 等于
!只能用于适应的操作值,不要拿符号比较大小
7.逻辑操作符
&& 逻辑与(并且) 两边为表达式,两个表达式都为真,结果才为真
|| 逻辑或(或者) 两边有一个是真,结果就为真
8.条件操作符
exp1 ? exp2 : exp3
exp1、2、3都为表达式,条件操作符的规则是:看exp1的真假,如果为真,则执行exp2;如果为假,则执行exp3;