C语言操作符详解

news2024/11/29 12:40:06

该内容全部代码请看:gitee仓库


第一部分:

板书部分:

1、操作符的分类:

在这里插入图片描述
注意:
移位操作符和位操作符
单目操作符中有sizeof
逗号表达式

2、算术操作符:
在这里插入图片描述
注意:
除法的使用
取模运算

3、移位操作符:
在这里插入图片描述
注意:
移动的是二进制
只可以是整数

4、整数的二进制表示形式:
在这里插入图片描述
注意:
原码反码补码
正整数的原码反码补码是相同的

负整数的原码反码补码:
在这里插入图片描述
注意:
反码是指原码的符号位不变,其他位按位取反
补码是反码加一

右移的区别:
在这里插入图片描述
注意:
采用算术右移就是左边补符号位
采用逻辑右移就是左边补0

代码部分:

#define _CRT_SECURE_NO_WARNINGS 1

#include<stdio.h>

//int main()
//{
//	int a = 15;
//	//00000000000000000000000000001111 - 原码
//	//00000000000000000000000000001111 - 反码
//	//00000000000000000000000000001111 - 补码
//
//	int b = -15;
//	//10000000000000000000000000001111 - 原码
//	//11111111111111111111111111110000 - 反码(原码的符号位不变,其他位按位取反得到的就是反码)
//	//11111111111111111111111111110001 - 补码(反码+1就是补码)
//	
//	//整数在内存中存储的是补码
//	//计算的时候也是使用补码计算的
//	return 0;
//}

//移位移动的是补码的二进制序列
//int main()
//{
//	int a = 15;
//	int b = a >> 1;
//	printf("%d\n", b);//7
//	printf("%d\n", a);
//	return 0;
//}

//int main()
//{
//	int a = -15;
//	int b = a >> 1;
//	printf("%d\n", b);
//	printf("%d\n", a);
//	return 0;
//}
//

//int main()
//{
//	int a = 6;
//	//左移操作符 - 左边丢弃,右边补0
//	//[00000000000000000000000000000110] - 6的补码
//	//[00000000000000000000000000001100] - 补码
//	//
//	/*int b = a << 1;
//	printf("%d\n", b);
//	printf("%d\n", a);*/
//
//	//a = a << 1;
//	//a <<= 1;
//	//a = a + 1;
//	//a += 1;
//
//	return 0;
//}


//int main()
//{
//	int a = 5;
//	int b = a >> -2;//标准未定义行为
//
//	return 0;
//}

第二部分:
板书部分:
1、位操作符:
在这里插入图片描述
注意:
按位与和按位或
按位异或

2、按位与:
在这里插入图片描述
注意:
两个数对应补码的二进制进行运算
都为1那么才为1

3、使用异或来进行交换两个数字
在这里插入图片描述
注意:
只需要三步

4、实现求一个整数存储在内存中的二进制中1的个数
在这里插入图片描述
注意:
只需要两步
先&1
再>>1
就是说从最低位开始&1
然后再去>>1
直到判断完每一位

5、单目操作符:
在这里插入图片描述
注意:
只有一个操作数

代码部分:

#define _CRT_SECURE_NO_WARNINGS 1

#include<stdio.h>


//int main()
//{
//	int a = 3;
//	//00000000000000000000000000000011 - 补码
//	int b = -5;
//	//10000000000000000000000000000101
//	//11111111111111111111111111111010
//	//11111111111111111111111111111011 - 补码
//	//
//	int c = a & b;
//	//& -- 对应二进制位有0则为0,两个同时为1,才是1
//	//00000000000000000000000000000011
//	//11111111111111111111111111111011
//	//00000000000000000000000000000011 - 补码
//	//
//	printf("%d\n", c);//3
//
//	return 0;
//}

//int main()
//{
//	int a = 3;
//	//00000000000000000000000000000011 - 补码
//	int b = -5;
//	//10000000000000000000000000000101
//	//11111111111111111111111111111010
//	//11111111111111111111111111111011 - 补码
//	//
//	int c = a | b;
//	//| - 按(2进制)位或 - 对应的二进制位有1则为1,两个同时为0才是0
//	//00000000000000000000000000000011
//	//11111111111111111111111111111011
//	//11111111111111111111111111111011 - 补码
//	//11111111111111111111111111111010
//	//10000000000000000000000000000101 - -5
//	printf("%d\n", c);//3
//
//	return 0;
//}

//int main()
//{
//	int a = 3;
//	//00000000000000000000000000000011 - 补码
//	int b = -5;
//	//10000000000000000000000000000101
//	//11111111111111111111111111111010
//	//11111111111111111111111111111011 - 补码
//	//
//	int c = a ^ b;
//	//^ - 按二进制位异或 -对应的二进制位相同为0,相异为1
//	//00000000000000000000000000000011
//	//11111111111111111111111111111011
//	//11111111111111111111111111111000 - 补码
//	//11111111111111111111111111110111
//	//10000000000000000000000000001000 - -8
//	printf("%d\n", c);//3
//
//	return 0;
//}

//& |
//^

//交换2个整型变量
//不能创建临时变量(第三个变量),实现两个整数的交换

//int main()
//{
//	int a = 3;
//	int b = 5;
//	printf("交换前:a=%d b=%d\n", a, b);
//	/*int tmp = a;
//	a = b;
//	b = tmp;*/
//
//	/*a = a + b;
//	b = a - b;
//	a = a - b;*/
//
//	a = a ^ b;
//	b = a ^ b;
//	a = a ^ b;
//
//	printf("交换后:a=%d b=%d\n", a, b);
//	return 0;
//}

//int main()
//{
//	int a = 3;
//	int b = 5;
//
//	//a^a -> 0
//	//a^0 = a
//	//异或是支持交换律的
//	//a^b^a = 5
//	//011
//	//101
//	//110
//	//011
//	//101
//	//a^a^b = 5
//	//
//	return 0;
//}
//


//int main()
//{
//	int flag = 5;
//	if (flag == 0)
//	{
//		printf("hehe\n");
//	}
//	if (!flag)//flag 为假 打印hehe
//	{
//		printf("hehe\n");
//	}
//	if (flag)
//	{
//		printf("haha\n");
//	}
//	return 0;
//}

//int main()
//{
//	int a = 5;
//	int b = -a;
//	printf("%d\n", b);
//	return 0;
//}

//&  * 应用于指针

//int main()
//{
//	int a = 10;
//	//pa是指针变量
//	int* pa = &a;//&-取地址操作符-取出a的地址
//
//	*pa = 20;//解引用操作符(间接访问操作符)-单目操作符-通用pa中存放的地址,找到指向的空间(内容)
//	int c = *pa;
//
//	return 0;
//}

第三部分:
板书部分:
1、sizeof和数组:
在这里插入图片描述
注意:
sizeof不是函数而是操作符
sizeof计算的是类型创建变量的大小 单位是字节
指针在32位4和64位8是不一样的

2、关系操作符:
在这里插入图片描述
3、逻辑操作符:
在这里插入图片描述
注意:
逻辑操作符具有短路现象
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

代码部分:

#define _CRT_SECURE_NO_WARNINGS 1

#include<stdio.h>


//int main()
//{
//	int a = 10;
//	printf("%d\n", sizeof(int));
//	printf("%d\n", sizeof(a));
//	printf("%d\n", sizeof a);//说明sizeof不是函数
//
//	return 0;
//}


//int main()
//{
//	int arr[10] = {0};
//	printf("%d\n", sizeof(arr));//40 - 计算整个数组的大小,单位字节
//	printf("%d\n", sizeof(int [10]));//
//	return 0;
//}

//
//~ 按补码二进制位取反
//
//int main()
//{
//	int a = 0;
//	printf("%d\n", ~a);//?
//	//00000000000000000000000000000000
//	//11111111111111111111111111111111 - 补码
//	//11111111111111111111111111111110
//	//10000000000000000000000000000001 -1
//	return 0;
//}
//

//
//int main()
//{
//	int a = 13;
//	//00000000000000000000000000001101
//	//00000000000000000000000000010000
//	a |= (1<<4);
//	printf("%d\n", a);
//	//00000000000000000000000000011101
//	//11111111111111111111111111101111
//	//00000000000000000000000000001101
//
//	a &= (~(1 << 4));
//	printf("%d\n", a);
//
//	return 0;
//}
//




//int main()
//{
//	int a = 0;
//	while (scanf("%d", &a) == 1)
//	{
//		printf("%d\n", a);
//	}
//	return 0;
//}


//int main()
//{
//	int a = 0;
//	//scanf 读取失败返回的是EOF
//	while (scanf("%d", &a) != EOF)
//	{
//		printf("%d\n", a);
//	}
//	return 0;
//}
//

//int main()
//{
//	int a = 0;
//	//scanf 读取失败返回的是EOF
//	//假设scanf 读取失败,返回EOF ---> -1
//	while (~scanf("%d", &a))
//	{
//		printf("%d\n", a);
//	}
//	return 0;
//}

//--前置、后置--
//++前置、后置++

//int main()
//{
//	int a = 1;
//	int b = a++;//后置++,先使用,后++
//	//b=a,a=a+1
//	printf("a=%d b=%d\n", a, b);//2 1
//	return 0;
//}

//
//int main()
//{
//	int a = 1;
//	int b = a--;//后置--,先使用,后--
//	//b=a,a=a-1
//	printf("a=%d b=%d\n", a, b);//0 1
//	return 0;
//}
//

//int main()
//{
//	int a = 1;
//	int b = ++a;//前置++,先++,后使用
//	//a=a+1,b=a
//	printf("a=%d b=%d\n", a, b);//2 2
//	return 0;
//}


//int main()
//{
//	int a = 1;
//	int b = --a;//前置--,先--,后使用
//	//a=a-1,b=a
//	printf("a=%d b=%d\n", a, b);//0 0
//	return 0;
//}


//int main()
//{
//	int a = 10;
//	printf("%d\n", a++);//
//	printf("%d\n", a);//
//
//	return 0;
//}
//

//int main()
//{
//	int a = (int)3.14;//强制
//	printf("%d\n", a);
//	// int a = int(3.14)//err
//	return 0;
//}
//

//#include <stdio.h>
//void test1(int arr[])//int*
//{
//	printf("%d\n", sizeof(arr));//(2)
//}
//void test2(char ch[])//char*
//{
//	printf("%d\n", sizeof(ch));//(4)
//}
//int main()
//{
//	int arr[10] = { 0 };
//	char ch[10] = { 0 };
//	printf("%d\n", sizeof(arr));//(1)
//	printf("%d\n", sizeof(ch));//(3)
//	test1(arr);//&arr[0]
//	test2(ch);// &ch[0]
//	return 0;
//}

//int main()
//{
//	int a = 0;
//	int b = 0;
//	scanf("%d %d", &a, &b);
//	//a 和 b 都是5,打印 hehe
//	if (a == 5 && b == 5)
//	{
//		printf("hehe\n");
//	}
//	//a 或者 b是5 打印哈哈
//	if (a == 5 || b == 5)
//	{
//		printf("haha\n");
//	}
//	return 0;
//}


//int main()
//{
//	int y = 0;
//	scanf("%d", &y);
//	//1. 能被4整除,并且不能被100整除
//	//2. 能被400整除是闰年
//	if (((y % 4 == 0) && (y % 100 != 0)) || (y % 400 == 0))
//	{
//		printf("闰年\n");
//	}
//	else
//	{
//		printf("不是闰年\n");
//	}
//	return 0;
//}
//


//#include <stdio.h>
//int main()
//{
//	int i = 0, a = 0, b = 2, c = 3, d = 4;
//	//i = a++ && ++b && d++;
//
//	i = a++||++b||d++;
//	
//	printf("a = %d\nb = %d\nc = %d\nd = %d\n", a, b, c, d);//
//	return 0;
//}
//


//逻辑操作符
//&& || ! - 计算结果是真,使用1表示
//int main()
//{
//	int a = 3 && 5;
//	printf("%d\n", a);
//
//	return 0;
//}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/512466.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

485接口的温湿度传感器和RJ45接口的温湿度传感器选择分析

工业以太网RJ45接口 网口温湿度传感器和RS485信号输出温湿度传感器的分析对比 主要适用场合&#xff1a;大型厂房、跨区域机房、多机房、机柜、数据机房、服务器机房、大数据中心、户外电站等 主要区别&#xff1a;以太网温湿度传感器输出信号RJ45&#xff0c;RS485温湿度传…

【JAVA面试】缓存穿透、缓存击穿、缓存雪崩

提示&#xff1a;文章先作为初版&#xff0c;等后续时间充足后&#xff0c;补充更深的内容 文章目录 缓存穿透、缓存击穿、缓存雪崩一、区别二、线程安全问题 缓存穿透、缓存击穿、缓存雪崩 一、区别 缓存穿透&#xff08;Cache Penetration&#xff09;&#xff1a; 缓存穿…

展会邀请丨虹科诚邀您5月12日于北京参与制药行业质量控制技术论坛

2023年上半年&#xff0c;虹科圆满举办了成都CPQC与杭州药安大会&#xff0c;在两场顺利进行的展会上&#xff0c;虹科的产品广受青睐&#xff0c;也获得了许多客户的认可与信赖&#xff0c;虹科也将继续以优质的产品和解决方案解决您的问题。 5月12-5月13日&#xff0c;虹科将…

卷积神经网络(CNN):基于PyTorch的遥感影像、无人机影像的地物分类、目标检测、语义分割和点云分类

我国高分辨率对地观测系统重大专项已全面启动&#xff0c;高空间、高光谱、高时间分辨率和宽地面覆盖于一体的全球天空地一体化立体对地观测网逐步形成&#xff0c;将成为保障国家安全的基础性和战略性资源。随着小卫星星座的普及&#xff0c;对地观测已具备多次以上的全球覆盖…

arm安装pyrealsense

arm安装pyrealsense – Step 1 – conda install numba pip install opencv-python pip install scipy – Step 2 pyrealsense2 – 参考 https://github.com/35selim/RealSense-Jetson 编译安装pyrealsense2 git clone -b v2.50.0 --depth1 https://github.com/IntelRealSens…

【Java】哈希冲突(哈希碰撞)

文章目录 为什么发生哈希冲突&#xff08;哈希碰撞&#xff09;能否完全避免哈希冲突常用处理哈希冲突的方法1.开放地址法1.1线性探测再散列缺点&#xff1a;二次聚集 1.2二次探测再散列1.3伪随机探测再散列 2.再哈希地址法3.链地址法4.建立公共溢出区 为什么发生哈希冲突&…

2C 兼容和小技巧 合集

这里写自定义目录标题 2C 兼容小技巧 合集修改input date默认框的小图标 2C 兼容小技巧 合集 以前一直是2b端没遇到过啥兼容性 或者 奇奇怪怪改UI的地方&#xff0c;现在换成C端业务&#xff0c;就在这里记录下遇到的奇奇怪怪的需求以及解决办法吧。 这篇文章争取 长久更新&am…

Kali-linux枚举服务

枚举是一类程序&#xff0c;它允许用户从一个网络中收集某一类的所有相关信息。本节将介绍DNS枚举和SNMP枚举技术。DNS枚举可以收集本地所有DNS服务和相关条目。DNS枚举可以帮助用户收集目标组织的关键信息&#xff0c;如用户名、计算机名和IP地址等&#xff0c;为了获取这些信…

Redis持久化:RDB和AOF

Redis持久化&#xff1a;RDB和AOF Redis 数据存储在内存中&#xff0c;如果不想办法将数据保存到硬盘上&#xff0c;一旦Redis重启(退出/故障)&#xff0c;内存的数据将会全部丢失。我们肯定不想 Redis 里的数据由于某些故障全部丢失(导致所有请求都走 MySQL)&#xff0c;即便发…

软考A计划-重点考点-专题九(数据结构知识)

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例 &#x1f449;关于作者 专注于Android/Unity和各种游戏开发技巧&#xff0c;以及各种资源分享&am…

解决报错‘cross-env‘ is not recognized as an internal...

目录 一、问题 1.1 问题描述 二、解决 2.1 解决 2.2 其它启动报错问题 一、问题 1.1 问题描述 今天在安装Ant Design Pro的后&#xff0c;执行 yarn start 时意外报错 cross-env is not recognized as an internal or external comman 报错后自然项目也就无法启动&…

组合数学第一讲

加法原则 432 9 879 96 乘法原则 3 * 2 6 800 2^55^2 因子可写成2^x5^y&#xff0c;其中x 0,1,2,3,4,5 y 0,1,2 6*3 18 4 3 * 2 10 数学归纳法 关键&#xff1a;假设n是正确的&#xff0c;证明n1也是正确的 Horse paradox&#xff08;马悖论&#xff09; 用PMI证…

如何提取文件名称到excel

如何提取文件名称到excel&#xff1f;在市场中很多小伙伴&#xff08;例如公司行政和文员&#xff09;就会碰到这个问题&#xff0c;将一些文件的名全部提取出来然后保存到excel表格中。当你在工作中如果遇到这个问题时&#xff0c;你却还在使用最传统的方法一个一个复制粘贴进…

深入剖析12大WEB安全漏洞与PAS防范措施

本文先介绍了12种常见WEB安全漏洞的原理和防范措施&#xff0c;然后介绍了PAS在安全漏洞防范上采取的措施。 目 录 01 WEB安全的基本介绍‍‍‍‍‍ 02 常见WEB安全漏洞的原理和防范‍‍‍‍‍‍ 03 PAS安全漏洞的防范‍‍‍‍ 01 WEB安全的基本介绍‍ WEB安全的前世今生 WE…

从FPGA说起的深度学习(十)

这是新的系列教程&#xff0c;在本教程中&#xff0c;我们将介绍使用 FPGA 实现深度学习的技术&#xff0c;深度学习是近年来人工智能领域的热门话题。 在本教程中&#xff0c;旨在加深对深度学习和 FPGA 的理解。 用 C/C 编写深度学习推理代码高级综合 (HLS) 将 C/C 代码转换为…

亚马逊云科技工业数据湖解决方案,助力企业打通各业务场景数据壁垒

数字化浪潮蓬勃发展&#xff0c;制造行业数字化转型热度迭起&#xff0c;根据麦肯锡面向全球400多家制造型企业的调研表明&#xff0c;几乎所有细分行业都在大力推进数字化转型&#xff0c;高达94%的受访者都称&#xff0c;数字化转型是他们危机期间维持正常运营的关键。 数字…

springboot第21集:SSO

单点登录单点登出支持跨域单点登录支持跨域单点登出 前台站点&#xff1a;业务站点A&#xff0c;业务站点B SSO站点&#xff1a;登录&#xff0c;退出 SSO服务&#xff1a;登录&#xff0c;登录状态&#xff0c;登出 数据库&#xff0c;登录状态缓存在Redis 登录时序图 客户端&…

【Swift】String与Sbustring区别与联系

String 还是字符串&#xff0c;始终如一。Substring 是string的切片。它们与base string共享内存buffer&#xff0c;并拥有一对范围索引。StringProtocol 抽取出字符串的特征以及如何访问其功能&#xff0c;放进一个协议中。String及Substring都遵循StringProtocol。 字符串在不…

从零开始学习机器学习和深度学习:基础知识、编程工具和实践经验

当涉及到机器学习和深度学习时&#xff0c;许多人可能感到不知所措。本文将为您提供入门机器学习和深度学习的基础知识。 什么是机器学习&#xff1f; 机器学习是人工智能的一个分支&#xff0c;其主要目的是通过训练算法来实现任务&#xff0c;而不是手动编程来实现任务。机器…

MySQL原理(二):逻辑架构和执行流程

前言 上一篇介绍了 MySQL 默认的 InnoDB 存储引擎是如何存储和组织数据的&#xff0c;这一篇将介绍 MySQL 的逻辑架构&#xff0c;以及分析一条 SQL 语句的具体执行过程。 逻辑架构 MySQL 的架构共分为两层&#xff1a;Server 层和存储引擎层。 Server 层负责建立连接、分析…