首页 > 其他分享 >C语言:操作符详解

C语言:操作符详解

时间:2024-07-26 14:25:37浏览次数:14  
标签:count 右移 int 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   

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

(二)操作符的优先级

在这里插入图片描述

二、结束语:

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

标签:count,右移,int,C语言,++,详解,操作符,表达式
From: https://blog.csdn.net/2301_81454749/article/details/140423764

相关文章

  • 一文详解 JuiceFS 读性能:预读、预取、缓存、FUSE 和对象存储
    在高性能计算场景中,往往采用全闪存架构和内核态并行文件系统,以满足性能要求。随着数据规模的增加和分布式系统集群规模的增加,全闪存的高成本和内核客户端的运维复杂性成为主要挑战。JuiceFS,是一款全用户态的云原生分布式文件系统,通过分布式缓存大幅提升I/O吞吐量,并使用成本较......
  • Java虚拟机详解(JVM)
    目录1.概念与历史背景2.结构与组成2.1类文件格式2.2主要内存区域3.功能与特性3.1类加载机制3.2垃圾回收机制3.3执行引擎3.4安全机制4.实现细节5.应用场景总结Java虚拟机(JavaVirtualMachine,简称JVM)是Java程序运行的核心组件,它为Java程序提供了一个......
  • mybatis的二级缓存详解
    MyBatis的二级缓存是一种强大的查询缓存机制,它在默认情况下是关闭的。要启用二级缓存,需要在SQL映射文件中添加 <cache/> 标签。以下是对MyBatis二级缓存的详细解释:1.基本概念一级缓存:基于PerpetualCache的HashMap本地缓存,其存储作用域为Session。当Session冲......
  • ElasticSearch第1讲(4万字详解 Linux下安装、原生调用、API调用超全总结、Painless、IK
    ElasticSearch官方文档:https://www.elastic.co/guide/en/elasticsearch/reference/current/getting-started.html非官方中文文档:https://learnku.com/docs/elasticsearch73/7.3极简概括:基于ApacheLucene构建开源的分布式搜索引擎。解决问题:MySQLlike中文全文搜索不走索引......
  • 详解视频中的I帧、P帧、B帧、GOP、IDR 和PTS, DTS
    一.视频传输原理视频是利用人眼视觉暂留的原理,通过播放一系列的图片,使人眼产生运动的感觉。单纯传输视频画面,视频量非常大,对现有的网络和存储来说是不可接受的。为了能够使视频便于传输和存储,人们发现视频有大量重复的信息,如果将重复信息在发送端去掉,在接收端恢复出来,这样就......
  • 校园导航图(C语言)
    功能分析主要实现了一个校园导航图的相关功能,具体分析如下:图的数据结构定义:AdjMatrix结构体定义了图的邻接矩阵、地点名称、地点介绍、地点个数和路线个数等信息。功能函数:WriteFileAdjMatrix:将邻接矩阵写入文件。delOldAddress:删除旧地点。delOldPath:删除指定路线。......
  • KingbaseES 自定义操作符使用示例
    本文详细介绍了KingbaseES中在兼容适配过程中,当遇到不支持的操作符,如何通过自定义方式解决兼容适配问题。Kingbase自定义操作符语法和用例如下:用例数据:createtabledemo(idnumeric(10,5));insertintodemovalues(1.1);insertintodemovalues(0);insertintodemoval......
  • C语言 —— 数组
    目录1.数组的概念2.一维数组2.1一维数组的创建2.2一维数组的初始化2.3一维数组的使用3.二维数组3.1二维数组的创建3.2二维数组的初始化3.2.1不完全初始化3.2.2完全初始化3.2.3按照行初始化3.2.4初始化可以省略行,但不能省略列3.3二维数组的使用1.数......
  • E19.【C语言】练习:数组
    有序序列合并描述输入两个升序排列的序列,将两个序列合并为一个有序序列并输出。数据范围:1≤n,m≤1000 ,序列中的值满足0≤val≤30000输入描述:输入包含三行,第一行包含两个正整数n,m,用空格分隔。n表示第二行第一个升序序列中数字的个数,m表示第三行第二个升序序列中数......
  • 34.【C语言之外】聊聊CE扫雷(XP版)作弊
    1.载入扫雷进程2.选9*9扫雷搜素左上角第一个雷的地址先:之后:与灵活切换  3.结果 格子的坐标(x,y):以下全是基址(1,1)~(9,1):对应01005361~01005369(1,2)~(9,2):对应01005381~01005389(1,3)~(9,3):对应010053A1~010053A9发现:01005381-01005361==010053A1-01005381=20(HEX),偏移量......