C语言:操作符详解

一、操作符

(一)操作符的类型

1.算术操作符

+    -   *   /   %

对于/操作符如果两个操作数都为整数,执行整数除法。而只要有浮点数执行的就是浮点数除法
% 操作符的两个操作数必须为整数。返回的是整除之后的余数。

2.移位操作符

注:移位操作符的操作数只能是整数。

<< 左移操作符   ——    对整数使用有乘二的效果
>> 右移操作符   ——   对整数使用有除二的效果
(1)左移操作符:

左边抛弃,右边补0。
在这里插入图片描述

(1)右移操作符:

右移操作符有两种,取决于编译器,例如我们对-10进行右移。
在这里插入图片描述

1.(逻辑移位):左边补0,右边抛弃。
在这里插入图片描述

2.(算数右移):左边用符号位填充,右边丢弃。
在这里插入图片描述

3.位操作符(二进制)

&         按位与            同为1取1,否则取0
|         按位或            含有1取1,否则取0
^         按位异或          相同取0,不同取1 
                           满足交换律 a^b^a = a^a^b
                           a^a = 0     a^0 = a
~         按位取反          对二进制位取反

位操作符在很多场景里面有奇效,下面例举几个例题

(1)不使用第三个变量,将a和b的值交换。
int main()
{
	int a = 3;
	int b = 5;
	printf("交换前:a=%d b=%d\n", a, b);
	a = a ^ b;
	b = a ^ b;
	a = a ^ b;
	printf("交换后:a=%d b=%d\n", a, b);
	return 0;
}
(2)统计整形中二进制中含1的数量

方法一:采用模2取余数的方法,依次得到每一位。

int count_bit_one1(unsigned int n)
{
	int count = 0;
	while (n)
	{
		if ((n % 2) == 1) count++;
		n = n / 2;
	}

	return count;
}

方法二:依次对每一位和1发生&运算。

int count_bit_one2(int n)
{
	int count = 0;
	for (int i = 0; i < 32; i++)
	{
		if (((n >> i) & 1) == 1) count++;
	}
	return count;
}

方法三:用算法n&(n - 1)可以削去n的二进制位最右边的一


int count_bit_one3(int n)
{
	int i = 0;
	int count = 0;

	while (n)
	{
		n = n & (n - 1);
		count++;
	}
	return count;
}
(3) 编写代码将13二进制序列的第5位修改为1,然后再改回0
int main()
{
	int a = 13;
	//原码           00000000000000000000000000001101

	//加一操作:
		//1 << (n - 1)   00000000000000000000000000010000
	
    int n = 5;
	a = a | (1 << (n - 1));
	printf("%d\n", a);
	
	//去一操作:
	//             00000000000000000000000000011101
	//             11111111111111111111111111101111
	
	a &= ~(a << (n - 1));
	printf("%d\n", a);
	return 0;
}

4.赋值操作符

=      

尽量不要使用连等,便于调试,防止歧义

5.单目操作符

!             逻辑反操作
-             负值
+             正值
&             取地址
sizeof        操作数的类型长度(以字节为单位)
~             对一个数的二进制按位取反
--            前置、后置--
++            前置、后置++
*             间接访问操作符(解引用操作符)
(  )         强制类型转换

6.关系操作符

>       >=       <          <=          !=           ==  

不小心写错” = “ 和” == “,会造成错误。

7.逻辑操作符

&&          逻辑与   
||          逻辑或

&& : 表达式两端都为真,那么为真,否则为假。在执行中,如果判断出一个为假,就不用继续判断。
|| :表达式只要含有真,结果为真,否则为假。在执行中,如果判断出一个为真,就不用继续判断

8.条件操作符

exp1 ? exp2 : exp3      

如果表达式exp1为真,返回表达式exp2的值,为假返回表达式exp3的值。

9.逗号表达式

exp1, exp2, exp3....expN   

从左向右计算,返回最后一个表达式的值。

(二)操作符的优先级

在这里插入图片描述

二、结束语:

关于操作符,其实十分重要但是我们又常常忘记它的用途,如果觉得小编写的还算全面,那就支持一下吧,小编会继续给出一些有用的知识,给个收藏加关注,学习路上不迷路!
在这里插入图片描述