【C语言初阶】带你轻松玩转所有常用操作符(1)

news2024/12/30 2:22:15

在这里插入图片描述

君兮_的个人主页

勤时当勉励 岁月不待人

C/C++ 游戏开发


Hello,这里是君兮_,最近要准备期末复习了,可能更新的就不会那么频繁了,下个星期回复正常更新。

操作符详解1

  • 前言
  • 一.操作符的分类
  • 二.算数操作符
  • 三.移位操作符
    • 1.二进制表示的三种形式
    • 2.左移操作符 <<
    • 3.右移操作符 >>
    • 4.错误的写法
  • 四.位操作符
    • 1.& 按位与
    • 2.| 按位或
    • 3.^ 按位异或
    • 4.位操作符应用实例
  • 总结

前言

今天给大家带来的是操作符详解,由于这部分的内容比较多,可能会分成几部分讲,今天带来的是第一部分的内容,废话不多说,咱们开始吧!

一.操作符的分类

  • 操作符大致分为以下几种
  • 算术操作符
  • 移位操作符
  • 位操作符
  • 赋值操作符
  • 单目操作符
  • 关系操作符
  • 逻辑操作符
  • 条件操作符
  • 逗号表达式
  • 下标引用、函数调用和结构成员
  • 咱们还是先画个图来说明,具体的再一个一个介绍用法及使用场景
    在这里插入图片描述

二.算数操作符

   +   -  *  /  %
    1. 除了 % 操作符之外,其他的几个操作符可以作用于整数和浮点数。
    1. 对于 / 操作符如果两个操作数都为整数,执行整数除法。而只要有浮点数执行的就是浮点数除法。
    1. % 操作符的两个操作数必须为整数。返回的是整除之后的余数。
  • 我们来通过一段代码理解一下:
#include<stdio.h>
int main()
{
	int r = 7 / 2;
	printf("%d\n", r);
	double d = 7 / 2;
	printf("%lf\n", d);//3.5?
	double d1 = 7.0 / 2.0;
	printf("%lf\n", d1);//3.5?

	return 0;
}
  • 运行结果
    在这里插入图片描述
  • 大家可能对打印的第一个数字和第三个数字都没什么疑问,唯一有问题的就是为什么第二个后面的小数部分被省去了,接下来我来讲讲原因
  • 我们可以看到7和2都是整数,那么执行的就是整数除法,在整形中是不存在小数的,因此小数点后面的部分会被直接舍去,此时我们又把7/2得到的3赋给一个浮点型的d,打印出来是要保留小数后面的几位的,因此打印出来的才是屏幕上的结果
  • 总结:
  • 当你想要进行浮点数除法时,除号两边的数得至少有一个浮点型!!!

三.移位操作符

<< 左移操作符
>> 右移操作符
 
注:移位操作符的操作数只能是整数。
  • 在讲这方面内容之前,先给大家简单的补充一些数据在内存中存储的知识,方便大家下面更好的理解,如果你想更具体的了解这方面的知识,不妨去看看我的这两篇博客,以下是链接:
    【C语言进阶】纳尼?这样学数据在内存中的存储竟然如此简单(1)?
    【C语言进阶】纳尼?这样学数据在内存中的存储竟然如此简单(2)?

整型在内存中是以二进制的形式存储的,而内存中存储的是补码,并且是倒着存的。

现在我来具体解释一下上面这段话。

1.二进制表示的三种形式

  • 二进制在内存中表示形式分别是原码,反码,补码。
  • 其中,数据在内存中是以二进制补码的形式进行存储的
  • 以下面的代码说明

int main()
{
	
	int num  = 10;//创建一个整型变量,叫num,这时num向内存申请4个字节来存放数据
	//4个字节-32比特位
	//00000000000000000000000000001010-原码
	//00000000000000000000000000001010-反码
	//00000000000000000000000000001010-补码

	int num2 = -10;//
	//10000000000000000000000000001010 - 原码
	//11111111111111111111111111110101 - 反码
	//11111111111111111111111111110110 - 补码
	


	return 0;
}
  • 十进制数据的二进制表现形式就是原码,原码最左边的一个数字就是符号位,0为正,1为负。
  • 对于正数而言,原码反码补码三者相同,对于负数而言,反码为原码符号位不变,其他位取反(1变为0,0变为1)
  • 对于负数而言,补码为反码+1。

2.左移操作符 <<

  • 移位规则
    左边抛弃,右边补零
  • 注意,以下我们所说的移位,移动的都是补码的二进制序列
int main()
{

	int num = 10;//创建一个整型变量,叫num,这时num向内存申请4个字节来存放数据
	//4个字节-32比特位
	//00000000000000000000000000001010-原码
	//00000000000000000000000000001010-反码
	//00000000000000000000000000001010-补码
	int b=num << 1;
	//00000000000000000000000000010100-补码
	printf("%d\n", num);
	printf("%d\n", b);

	
	return 0;
}

在这里插入图片描述

  • 注意,移位操作并不会改变原来变量的大小!!

3.右移操作符 >>

  • 移位规则:
  • 首先右移运算分两种:
  • 1. 逻辑移位
    左边用0填充,右边丢弃
  • 2. 算术移位
    左边用原该值的符号位填充,右边丢弃
int main()
{

	int num = 10;
	
	//逻辑右移 左边用0填充,右边丢弃
	//00000000000000000000000000001010-补码
	int b=num >> 1;
	//00000000000000000000000000000101-补码
	printf("%d\n", num);
	printf("%d\n", b);
	//算数右移 左边用原该值的符号位填充,右边丢弃
	int num1 = -1;
	//10000000000000000000000000000001-原码
	//11111111111111111111111111111110-反码
	//11111111111111111111111111111111-补码
	int c = num1 >> 1;
	printf("%d", c);
	
	return 0;
}


  • C语言没有明确规定是逻辑右移还是算术右移,但是一般编辑器采用的都是算术右移
    在这里插入图片描述
  • 如图可见,我们当前编译器采用的是逻辑右移,否则符号位应该变为0打印出来的应该是一个正数。

4.错误的写法

  • 另外,要注意这种写法:
int main()
{
	int a = 5;
	int b = a >> -2;//标准未定义行为

	return 0;
}

  • 有些人可能脑子一抽,突然想到,我右移一个负数不就是左移吗?
  • 注意:对于移位运算符,不要移动负数位,这个是标准未定义行为!!

四.位操作符

  • 位操作符有:
 & //按位与
 | //按位或
 ^ //按位异或
  • 注:他们的操作数必须是整数
  • 以下位操作符对应操作的仍然是二进制补码

1.& 按位与

& 按位与 ---- 对应二进制位有0则为0,两个同时为1,才是1

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;
//}

在这里插入图片描述


2.| 按位或

| 按位或 ---- 对应的二进制位有1则为1,两个同时为0才是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;
}

在这里插入图片描述


3.^ 按位异或

^ 按位异或 ----对应的二进制位相同为0,相异为1

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;
}

在这里插入图片描述


4.位操作符应用实例

  • 看了上面的内容,可能有些人会有疑问,这些位操作符具体都有啥用呢?
  • 以下我们来通过几个例子说明:
  • 1.我们先来看一个简单的例子
int main()
{
int num1 = 1;
int num2 = 2;
num1 & num2;
num1 | num2;
num1 ^ num2;
return 0;
}
  • 上面的这段代码a,b,c的结果是多少?
    在这里插入图片描述
  • 很简单吧?遇到这种问题一定不要偷懒,画图是最好的解决方法!
  • 2.在不创建临时变量(第三个变量)的情况下,实现两个数的交换。
  • 这其实是某公司的一个面试题,如果你能理解上面所讲的内容并学会应用,其实并不复杂。
  • 实现代码如下:
//在不创建临时变量(第三个变量)的情况下,实现两个数的交换。
int main()
{
	int a = 10;
	00000000000000000000000000001010--10的补码
	int b = 20;
	00000000000000000000000000010100--20的补码
	a = a ^b;
	b = a ^ b;
	a = a ^ b;
	printf("a=%d b=%d", a, b);
	return 0;
}

在这里插入图片描述

  • 成功实现我们的目标,可是为什么呢?
  • 下面我来解释一下,如果你是基础不是特别好的初学者的话,这里还是建议自己先画图感受一下哦!
	a = a ^b;
	//00000000000000000000000000001010--a
	//00000000000000000000000000010100--b
	//00000000000000000000000000011110--a=a^b
  • 此时a已经变成了a ^b

	b = a ^ b;
	//00000000000000000000000000010100--b
	//00000000000000000000000000011110--a=a^b
	//00000000000000000000000000001010-b=a^b    
  • 此时的b已经与a完成交换变成10了
a = a ^ b;
	//00000000000000000000000000011110--a=a^b
	//00000000000000000000000000001010-b=a^b 
	//00000000000000000000000000010100 a=a^b a=20
  • 最后一次异或,把b的值交换给a
  • 逐步分析这段代码是不是就清晰多了?

总结

  • 今天的内容暂时到这里就结束了,我们今天讲了有关算数操作符,移位操作符和位操作符的应用,如果你还有所困惑不妨自己动手实操一下,这方面的知识是稍微有点抽象,需要咱们反复的练习熟悉起来才行。
  • 以上就是关于操作符的第一部分内容,后面其他的操作符应用详解会在近期分批次更新,敬请期待!!
  • 好了,如果你有任何疑问欢迎在评论区或者私信我提出,大家下次再见啦!

新人博主创作不易,如果感觉文章内容对你有所帮助的话不妨三连一下这个新人博主再走呗。你们的支持就是我更新的动力!!!

**(可莉请求你们三连支持一下博主!!!点击下方评论点赞收藏帮帮可莉吧)**

在这里插入图片描述

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

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

相关文章

【C/C++】构造函数与析构函数

创作不易&#xff0c;本篇文章如果帮助到了你&#xff0c;还请点赞 关注支持一下♡>&#x16966;<)!! 主页专栏有更多知识&#xff0c;如有疑问欢迎大家指正讨论&#xff0c;共同进步&#xff01; &#x1f525;c系列专栏&#xff1a;C/C零基础到精通 &#x1f525; 给大…

【话题研究】重塑活力:顺应消费需求变化,PC市场需创新、技术驱动和营销策略更优解

话题研究&#xff1a;大众还需要PC吗&#xff1f;PC市场如何走出寒冬&#xff1f; 1️⃣ PC市场进入寒冬的深层原因2️⃣ PC仍具有独特的优势和不可替代性3️⃣ 创新、定制化和用户体验4️⃣ AI、VR时代带来的新出路 市场调研机构 Canalys数据显示&#xff0c;今年一季度&#…

elastic-job-ui在使用druid作为数据库连接池时作业维度报错

问题说明&#xff1a; 我们项目中使用到了elastic-job&#xff0c;然后自己封装了个sdk&#xff0c;方便使用&#xff0c;里面的数据源配置是常用的druidmysql的组合&#xff0c;在操作中&#xff0c;发现elastic-job-ui可视化控制台会报错无法使用。 深究其原因是因为&#…

返回值封装,异常统一处理优雅解决接口所有问题

在项目整体架构设计的时候&#xff0c;我们经常需要做以下工作&#xff1a; 返回值的统一封装处理&#xff0c;因为只有规范好统一的返回值格式&#xff0c;才能不会给接口使用者带来疑惑和方便前端对接口的统一处理。对异常码进行严格规定&#xff0c;什么错误返回什么码制&a…

ShardingSphere-JDBC 5.1.1 分库分表

分库分表解决的问题 mysql的扩展 mysql并不能完全利用高性能服务器的硬件&#xff0c;当cpu超过24个&#xff0c;内存超过128G时&#xff0c;mysql性能处于平缓&#xff0c;不在上升&#xff0c;所以在一个性能强大的服务器上运行多个实例&#xff0c;才更合理 mysql常见的扩…

java.sql.SQLException: No value specified for parameter 6

异常 java.sql.SQLException: No value specified for parameter 6 原因 sql中定义了6个参数&#xff0c;只传了5个参数

设计模式—“领域规则”

在特定领域中,某些变化虽然频繁,但可以抽象为某种规则。这时候,结合特定领域,将问题抽象为语法规则,从而给出在该领域下的一般性解决方案。 典型模式有:Interpreter Interpreter 动机 在软件构建过程中,如果某一个特定领域的问题比较复杂,类似的结构不断重复出现,…

.NET Microsoft.Extensions.Logging + NLog 记录日志到文件

最近想了解下面向对象开发&#xff0c;选择C# 语言 以及NET6.0 日志是开发中最常用的功能&#xff0c;本文记录下其中日志使用方法&#xff0c;理解不全的地方后续再学习补充 环境 Ubuntu 22.04.2 LTSdotnet 6.0.411 准备工作 # https://learn.microsoft.com/zh-cn/dotnet/c…

2023.6.21AgentGPT部署

在云服务器上使用Docker部署AgentGPT 需要自行提供OpenAI的API Key https://platform.openai.com/account/api-keys 需要自行提供云服务器或者虚拟机 需要自行解决网络的问题&#xff0c;本文中使用的是小喵咪解决网络的问题【需要订阅地址】 文章目录 在云服务器上使用Docker…

数据在内存中的存储-浮点型

常见的浮点型数据&#xff1a;单精度浮点型float、双精度浮点型double,还有long double类型。 浮点数表示的范围&#xff1a;float.h中定义 目录 一、浮点数存储的例子 二、浮点数存储规则 三、例题解释 一、浮点数存储的例子 #include<stdio.h> int main() {int …

王道操作系统学习笔记(1)——操作系统基本概念

前言 本文介绍了操作系统的基本概念&#xff0c;文章中的内容来自B站王道考研操作系统课程&#xff0c;想要完整学习的可以到B站官方看完整版。 一&#xff1a;操作系统基本概念 1.1.1&#xff1a;基本概念和功能 操作系统&#xff1a;系统资源的管理者&#xff08;处理机管…

QGIS 插件获取哨兵数据

基于 Sentinel Hub QGIS 插件&#xff0c;该插件允许您直接在 QGIS中配置和利用Sentinel Hub 服务的强大功能。该插件可视化 Sentinel 数据&#xff0c;可用于正在处理的任何其他项目中。 来自&#xff1a;GIS数据栈整理&#xff1a;GIS数据栈 一起来看看如何在QGIS中使用吧&am…

6张图表 + 1个案例 带你入门tcpdump的使用和原理

一、tcpdump简介 tcpdump是什么&#xff1f; 来看看 tcpdump官网怎么说&#xff1a;This is the home web site of tcpdump, a powerful command-line packet analyzer; and libpcap, a portable C/C library for network traffic capture. 不妨来看看chatGPT插件怎么说&…

【自我提升】openCV基本操作

写在前面&#xff1a;本篇博客主要是记录opnecv的基本操作&#xff0c;不记录安装等步骤。方便回顾和查找方法。 一、图像的IO操作&#xff0c;读取和保存方法 读取图像 在OpenCV中&#xff0c;读取图像的函数是imread()。该函数可以从指定的文件中加载图像&#xff0c;返回值…

Qt6.2教程——5.QT常用控件QLabel

1. QLabel简介 QLabel是Qt库中一个非常基础且重要的类。它主要用于在图形用户界面(GUI)中展示文本或图片。最常见的用法就是在窗口上显示一段文字或者标签&#xff0c;比如“用户名”&#xff0c;“密码”等等。QLabel继承自QFrame&#xff0c;因此它也可以具有框架。它能处理…

0005Java程序设计-jsp企业财务管理系统设计与实现

企业财务管理系统 摘要 对于企业集来说,财务管理的地位很重要。随着计算机和网络在企业中的广泛应用&#xff0c;企业发展速度在不断加快&#xff0c;在这种市场竞争冲击下企业财务管理系统必须优先发展&#xff0c;这样才能保证在竞争中处于优势地位。对此企业必须实现财务管…

安卓平板修改和平精英90帧、120帧超广角,2k/4k分辨率(无需root!!!)

前言&#xff1a;今天我们将探讨如何在安卓平板上修改和平精英超广角以及高帧率画质效果。 1、首先&#xff0c;我们要知道平板改超广角的好处是什么&#xff1f;我们都知道平板相比于手机显示宽度是要更大的&#xff0c;如果平板再改个超广角效果&#xff0c;甚至连脚都可以看…

避免滥用Qt信号与槽——改进taskBus 平台以吞吐20M IQ采样带宽

taskBus 软件无线电平台是一款依靠 stdin-stdout进行数据吞吐的教学平台。在平台创建之初&#xff0c;主要使用 RTL-SDR进行简单的窄带接收应用&#xff0c;并没有考虑采样率超过1.8M的情况。引入 USRP B210/B205mini后&#xff0c;采样率瞬间提高到2M以上&#xff0c;此时&…

springboot+vue项目中如何利用七牛云实现头像的上传

做了个前后端分离的项目&#xff0c;对于用户的头像修改一直不是很满意&#xff0c; 于是用了Vant4的组件库改成了文件点击上传&#xff0c;先是打算存到本地&#xff0c;了解到七牛云的方便后&#xff08;主要是免费&#xff09;&#xff0c;决定改成七牛云存储图片&#xff…