当前位置: 首页 > news >正文

C语言基础之——操作符(上)

本篇文章,我们将展开讲解C语言中的各种常用操作符,帮助大家更容易的解决一些运算类问题。

这里提醒一下小伙伴们,本章知识会大量涉及到二进制序列,不清楚二进制序列的小伙伴,可以去阅读我的另一篇文章《数据在内存中的存储》学习了解。


目录

一.操作符分类

二.操作符讲解

1.算数操作符

2.移位操作符

(1)左移操作符 

(2)右移操作符

3.位操作符

(1)& 按位与

 (2)| 按位或

 (3)^ 按位异或

4.赋值操作符

5.单目操作符

总结


一.操作符分类

  • 算术操作符
  • 移位操作符
  • 位操作符
  • 赋值操作符
  • 单目操作符
  • 关系操作符
  • 逻辑操作符
  • 条件操作符
  • 逗号表达式
  • 下标引用,函数调用和结构成员

二.操作符讲解

由于操作符数量过多,所以本期文章我们将仅仅讲解前五种。

1.算数操作符

算数操作符包括 “+,-,*,/,%” 五个。较为简单,小伙伴们只需要注意以下几点:

  1. 除了“%”操作符之外,其他的几个操作符可以作用于整数和浮点数。
  2. 对于“/”操作符如果两个操作数都为整数,执行整数除法。只要有浮点数就执行浮点数除法
  3. “%”操作符的两个操作数必须为整数,返回的是整除后的余数

2.移位操作符

<<        左移操作符

>>        右移操作符

移位操作符的左边是要操作的数右边则是要移动的位数

要注意的是,移位操作符的操作数只能是整数,移动的对象则是整数的二进制序列

一个整型占四个字节,也就是32个bit位,要记住,整型在数据中存储的是二进制序列的补码,所以我们对整型的操作都是对其补码进行操作的。

(1)左移操作符 

左移操作符,顾名思义就是将整数的二进制序列向左边移动呗,那么它的规则是什么呢???

移位规则:

左边丢弃,右边补0

#include<stdio.h>
int main()
{int n = 6;//00000000 00000000 00000000 00000110-移动前//00000000 00000000 00000000 00001100-移动后int m = n << 1;printf("%d\n", n);printf("%d\n", m);return 0;
}

如上代码,将“6”的二进制序列向左移动一位,便得到了一个新的二进制序列。结果如下:

 由结果可以看出,移位操作符并不会改变操作数本身,而且细心的小伙伴们可以看出,向左移动一位不就相当于每一位的数字都“乘2”嘛,也就是将数字翻倍,移动n位,便翻2的n次方倍

负数的操作与之一样,就是小伙伴们千万不要忘记原码和补码之间的转换

(2)右移操作符

移位规则:

右移运算分为两种:

1.逻辑移位

左边用0填充,右边丢弃

2.算术移位

左边用原值的符号位填充,右边丢弃

不同的编译器会有不同的右移运算,但是我们平时所使用的绝大多数编译器都是算数右移

#include<stdio.h>
int main()
{int n = -15;//10000000 00000000 00000000 00001111-原码//11111111 11111111 11111111 11110000-反码//11111111 11111111 11111111 11110001-补码//11111111 11111111 11111111 11111000-移动后补码//11111111 11111111 11111111 11110111-移动后反码//10000000 00000000 00000000 00001000-移动后原码int m = n >> 1;printf("%d\n", n);printf("%d\n", m);return 0;
}

结果如下: 

 同左移类似,右移则是将数字折半,但是如果是奇数的话,结果则会是比小数小的最临近于小数的负数。比如-15的右移结果就是-8。

3.位操作符

&       按位与

|         按位或

^        按位异或

位操作符的操作数也必须是整数,也是对其二进制序列动手。

(1)& 按位与

假如我是一个企业高管,我现在需要程序员A程序员B一起来完成某个项目,这说明,A和B是必不可少的,他们两个少了谁这个项目都完不成。这便是按位与

口诀:同真则真,有假则假

#include<stdio.h>
int main()
{int a = 6;//00000000 00000000 00000000 00000110-补码int n = -15;//11111111 11111111 11111111 11110001-补码int m = a & n;//00000000 00000000 00000000 00000110-补码//11111111 11111111 11111111 11110001-补码//00000000 00000000 00000000 00000000-m的补码(重点)printf("%d\n", m);return 0;
}

我们习惯上将二进制序列的“1”视为真“0”视为假,a&n,便是两个二进制序列对应的每一位相与,从而得到一个新的二进制序列。

由上可知,m的二进制序列全为0,也就代表m的值为0,结果如下:

 (2)| 按位或

假如我又是一个企业高管,我现在需要程序员A程序员B来完成某个项目,这说明,A和B他们两个只要有一个能来做这个项目,就能成,如果一个都没有,就做不了。这便是按位或

口诀:同假则假,有真则真

#include<stdio.h>
int main()
{int a = 6;//00000000 00000000 00000000 00000110-补码int n = -15;//11111111 11111111 11111111 11110001-补码int m = a | n;//00000000 00000000 00000000 00000110-补码//11111111 11111111 11111111 11110001-补码//11111111 11111111 11111111 11110111-m的补码(要点)//11111111 11111111 11111111 11110110-m的反码//10000000 00000000 00000000 00001001-m的原码printf("%d\n", m);return 0;
}

对两个二进制序列的每一位相或,便得到m的补码,但是m的符号位为1,是负数,所以要转化为原码来读。

结果如下:

 (3)^ 按位异或

假如我还是一个企业高管……这个不好举例子了哈哈哈直接来看口诀:

相同为0,不同为1

#include<stdio.h>
int main()
{int a = 6;//00000000 00000000 00000000 00000110-补码int n = -15;//11111111 11111111 11111111 11110001-补码int m = a ^ n;//00000000 00000000 00000000 00000110-补码//11111111 11111111 11111111 11110001-补码//11111111 11111111 11111111 11110111-m的补码(重点)//11111111 11111111 11111111 11110110-m的反码//10000000 00000000 00000000 00001001-m的原码printf("%d\n", m);return 0;
}

将两个二进制序列的每一位相异或,结果如下:

4.赋值操作符

所谓赋值操作符,也就是我们经常使用的“ = ”将一个常量或者常量表达式赋给一个变量

int a = 1;//不是赋值,是创建之后的初始化

a = 5;//是赋值

int b = 2;

int c = 0;

c = a + b;//也是赋值

除了等号以外,还有一些常用的复合赋值操作符:

+=        -=        *=        /=        %=        >>=        <<=        &=        |=        ^=

这些符合赋值其实是两个运算式的合并,例如:

int a = 2;

a = a + 5 和 a += 5 是一样的效果,后者看起来会更加的简洁

5.单目操作符

所谓单目,也就是这种操作符的操作数只有一个

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

 这些操作符我们大多数都知道,下面我们仅仅讲解一下不是那么熟悉的:

sizeof        操作数的类型长度

sizeof 计算的结果是 size_t 类型

size_t 是无符号整型

对 size_t 类型的数据进行打印,可以使用%zd或%u

int a = 10;

printf("%zd",sizeof(a));

结果为4。 

~                  对一个数的二进制按位取反

int a = 0;

printf("%d",~a);

0的补码二进制序列为:

00000000 00000000 00000000 00000000

111111111 111111111 111111111 111111111//为负数,取原码

111111111 111111111 111111111 111111110//反码

10000000 00000000 00000000 00000001//原码

结果为-1。

*        间接访问操作符

int a = 10;

int* p = &a;

*p;//这时候我们的*就是对p进行解引用操作,*p是通过p中存放的地址,找到p指向的对象。

*p 其实就是a。

(类型)           强制类型转换

int a = (int )3.14;

3.14在编译器中会被默认为是double类型,如果直接将其初始化给int型的a,则会在后续操作中出现误差甚至错误,所以要将其强制类型转化为int型。

总结

本期关于操作符的知识讲解到这里就要结束啦,稍后博主将更新C语言基础之——操作符(下)来讲解剩余的操作符。

喜欢博主文章的小伙伴们不要忘记一键三连哦,我们下期再见!

相关文章:

C语言基础之——操作符(上)

本篇文章&#xff0c;我们将展开讲解C语言中的各种常用操作符&#xff0c;帮助大家更容易的解决一些运算类问题。 这里提醒一下小伙伴们&#xff0c;本章知识会大量涉及到二进制序列&#xff0c;不清楚二进制序列的小伙伴&#xff0c;可以去阅读我的另一篇文章《数据在内存中的…...

手写链式调用

遇到一个有趣的题目&#xff0c;做个笔记 实现一个arrange函数&#xff0c;可以进行时间和工作调度 //[> …]表示调用函数后的打印内容 //arrange(‘William’).execute(); //> William is notified //arrange(‘William’).do(‘commit’).execute(); //>William …...

DETRs with Collaborative Hybrid Assignments Training论文笔记

Title&#xff1a;[DETRs with Collaborative Hybrid Assignments Training Code 文章目录 1. Motivation2. one to one VS one to many3. Method&#xff08;1&#xff09;Encoder feature learning&#xff08;2&#xff09;Decoder attention learning 1. Motivation 当前…...

慧程HiperM3系列工业物联网、MES平台

产品链接&#xff1a;慧程产品主页...

SHELL 基础 入门(三) Bash 快捷键 命令执行顺序,详解通配符

目录 Bash 常用快捷键 输入输出重定向 << 用法 输出重定向 命令执行顺序 ; 分号 && || 通配符 传统通配符 &#xff1f; * [ ] [ - ] [ ^ ] 常用字符 强调 &#xff1a; { } 生成序列 Bash 常用快捷键 Ctrl A 把光…...

nvm安装使用教程

文章目录 下载配置安装最新稳定版 node安装指定版本查看版本切换版本删除版本 常见问题安装node后 显示拒绝访问的问题使用cnpm会报错的问题降低cnpm版本npm镜像 下载 NVM for Windows 下载地址&#xff1a;https://link.juejin.cn/?targethttps%3A%2F%2Fgithub.com%2Fcoreyb…...

【Android】JUnit和Espresso单元测试新手快速入门

引入依赖 android {defaultConfig {testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"}}dependencies {testImplementation junit:junit:4.13.2androidTestImplementation androidx.test.ext:junit:1.1.0androidTestImplementation androidx.tes…...

8.4 【C语言】通过指针引用字符串

8.4.1 字符串的引用方式 在C程序中&#xff0c;字符串是存放在字符数组中的。想引用一个字符串&#xff0c;可以用以下两种方法。 &#xff08;1&#xff09;用字符数组存放一个字符串&#xff0c;可以通过数组名和下标引用字符串中一个字符&#xff0c;也可以通过数组名和格…...

【广州华锐视点】AR配电所巡检系统:可视化巡检利器

随着科技的发展&#xff0c;人工智能、大数据等技术逐渐应用于各个领域&#xff0c;为人们的生活带来便利。在电力行业&#xff0c;AR(增强现实)技术的应用也日益广泛。AR配电所巡检系统作为一种新型的巡检方式&#xff0c;可以实现多种功能&#xff0c;提高巡检效率&#xff0…...

微服务中间件--http客户端Feign

http客户端Feign http客户端Feigna.Feign替代RestTemplateb.自定义Feign的配置c.Feign的性能优化d.Feign的最佳实践分析e.Feign实现最佳实践(方式二) http客户端Feign a.Feign替代RestTemplate 以前利用RestTemplate发起远程调用的代码&#xff1a; String url "http:…...

C语言学习系列-->【关于qsort函数的详解以及它的模拟实现】

文章目录 一、概述二、qsort函数参数介绍三、qsort实现排序3.1 qsort实现整型数组排序3.2 qsort实现结构体数组排序 四、模拟实现qsort函数 一、概述 对数组的元素进行排序 对数组中由 指向的元素进行排序&#xff0c;每个元素字节长&#xff0c;使用该函数确定顺序。 此函数使…...

Linux系统安全:NAT(SNAT、DNAT)

目录 一.NAT 二.SNAT 三.DNAT 一.NAT NAT: network address translation&#xff0c;支持PREROUTING&#xff0c;INPUT&#xff0c;OUTPUT&#xff0c;POSTROUTING四个链 请求报文&#xff1a;修改源/目标IP&#xff0c; 响应报文&#xff1a;修改源/目标IP&#xff0c;根据…...

【数据库】MySQL存储过程:提升数据库性能和操作效率的利器

在数据库管理系统中&#xff0c;存储过程是一种重要的数据库对象&#xff0c;它允许将一组复杂的SQL语句组合起来&#xff0c;形成一个独立的单元进行重复使用。存储过程可以极大地提高数据库的性能和操作效率&#xff0c;降低网络流量&#xff0c;减轻系统负载。本文将深入探讨…...

rust写一个多线程和协程的例子

当涉及到多线程和协程时&#xff0c;Rust提供了一些非常强大的工具&#xff0c;其中最常用的库之一是tokio&#xff0c;它用于异步编程和协程。下面我将为你展示一个简单的Rust程序&#xff0c;演示如何使用多线程和协程。 首先&#xff0c;你需要在你的项目的Cargo.toml文件中…...

react18+antd5.x(1):Notification组件的二次封装

antdesign已经给我们提供了很好的组件使用体验,但是我们还需要根据自己的项目业务进行更好的封装,减少我们的代码量,提升开发体验 效果展示 开起来和官网的使用没什么区别,但是我们在使用的时候,进行了二次封装,更利于我们进行开发 MyNotification.jsx,是我们的业务页面…...

jenkins运行pytest测试用例脚本报错:没有权限,无法写日志PermissionError:[Error 13]Permission denied

报错信息&#xff1a; PermissionError:[Error 13]Permission denied&#xff1a;‘/var/jenkins_home/workspace/deleverySystem/Delivery_System/out_files/logs/waimai_20230823.log’ 解决方法&#xff1a; 在jenkins容器内部输入 chmod -R 777 /var/jenkins_home/works…...

数据结构 day1

1>x.mind 2>间接定义结构体数组&#xff0c;进行4种方式的定义和初始化 3>定义结构体存储10辆车&#xff08;车的信息&#xff1a;品牌、单价、颜色&#xff09; 1.定义函数&#xff0c;实现循环输入 2.定义函数&#xff0c;实现排序 3.定义函数&#xff0c;计算红色车…...

湖北咸宁农业三维扫描数字化农业3d打印制造应用-CASAIM中科广电

农业是人类衣食之源、生存之本&#xff0c;是一切生产的首要条件&#xff0c;CASAIM在农业三维扫描和3d打印应用上有丰富经验。 1.三维扫描技术在农业领域的应用 CASAIM三维扫描是集光学、机电和计算机技术于一体的高新无损检测技术&#xff0c;能够对实物的空间外形、结构乃…...

Jenkins的定时任务配置

jenkins配置定时任务位置(点击日程表的问好可查看语法配置) jenkins的定时任务的参数 # 定时任务参数(每个参数之间使用tab键或空格分隔)MINUTE HOUR DOM MONTH DOW 参数解释取值范围 MINUTE 分钟0-59HOUR小时0-23DOM一月的天数1-31MONTH月份1-12DOW 一周的天数0…...

THINKPHP 微联云投票系统源码独立版 + 支持刷礼物

THINKPHP 微联云投票系统源码独立版 支持刷礼物 nginxphp7.2以上 mysql5.6以上 简单测试后台基本没什么问题&#xff0c;暂时发现H5前端有bug,自行修复。...

复杂会场巡检机器人路径规划【附代码】

✨ 长期致力于路径规划、RRT~*算法、人工势场法、自动巡检研究工作&#xff0c;擅长数据搜集与处理、建模仿真、程序编写、仿真设计。 ✅ 专业定制毕设、代码 ✅ 如需沟通交流&#xff0c;点击《获取方式》 &#xff08;1&#xff09;提出基于安全边界与朝向合力场随机游走的改…...

嵌入式核心板小型化设计:从邮票孔到板对板连接器的技术演进与应用

1. 项目概述&#xff1a;当“小”成为一种刚需在嵌入式硬件开发领域&#xff0c;我们常常面临一个经典的权衡&#xff1a;性能、成本与体积。过去&#xff0c;为了追求极致的稳定性和丰富的接口&#xff0c;核心板往往做得比较大&#xff0c;通过邮票孔或高密度连接器与底板固定…...

ModelScope架构深度解析:大规模AI模型服务化实战指南

ModelScope架构深度解析&#xff1a;大规模AI模型服务化实战指南 【免费下载链接】modelscope ModelScope: bring the notion of Model-as-a-Service to life. 项目地址: https://gitcode.com/GitHub_Trending/mo/modelscope ModelScope作为阿里巴巴开源的模型即服务平台…...

巷道管道安装机器人紧固装配控制【附仿真】

✨ 长期致力于六轴机械臂、运动学建模、轨迹规划、柔顺控制、六维力/力矩传感器研究工作&#xff0c;擅长数据搜集与处理、建模仿真、程序编写、仿真设计。 ✅ 专业定制毕设、代码 ✅ 如需沟通交流&#xff0c;点击《获取方式》 &#xff08;1&#xff09;六自由度机械臂运动学…...

SuperMap Objects开发避坑指南:从COM引用到内存释放的实战经验总结

SuperMap Objects开发避坑指南&#xff1a;从COM引用到内存释放的实战经验总结 在GIS二次开发领域&#xff0c;SuperMap Objects以其强大的空间数据处理能力备受开发者青睐。然而&#xff0c;当我们将这个COM组件集成到C# WinForms项目中时&#xff0c;往往会遇到一些官方文档…...

MOXA NPort 5110串口服务器避坑指南:网线直连、波特率设置与Web管理那些事儿

MOXA NPort 5110串口服务器实战避坑手册&#xff1a;从硬件部署到批量管理的深度解析 第一次接触工业级串口服务器时&#xff0c;我对着那个巴掌大的金属盒子发呆了十分钟——RJ45、DB9、电源接口密密麻麻挤在一起&#xff0c;配套光盘里还有三个不同功能的配置工具。直到现场调…...

5步搭建Sunshine游戏串流服务器:打造你的私人云游戏平台

5步搭建Sunshine游戏串流服务器&#xff1a;打造你的私人云游戏平台 【免费下载链接】Sunshine Self-hosted game stream host for Moonlight. 项目地址: https://gitcode.com/GitHub_Trending/su/Sunshine Sunshine是一款功能强大的自托管游戏串流服务器&#xff0c;专…...

开源商业技能知识库:从道法术器到实战应用的全解析

1. 项目概述&#xff1a;一个面向商业技能的开源知识库 最近在GitHub上闲逛&#xff0c;发现了一个挺有意思的项目&#xff0c;叫 openclaw-business-skills 。光看名字&#xff0c;你可能会觉得这又是一个普通的“商业技能”教程合集。但点进去仔细研究后&#xff0c;我发现…...

TensorRT量化实战:动态范围计算中的熵校准与直方图优化

1. TensorRT量化中的动态范围计算基础 在模型部署的工程实践中&#xff0c;量化技术是提升推理效率的关键手段。TensorRT作为业界领先的推理优化框架&#xff0c;其INT8量化功能可以将模型体积压缩至原来的1/4&#xff0c;同时保持较高的推理精度。但量化过程中最关键的挑战就是…...

FanControl风扇控制:3分钟掌握专业级Windows散热管理终极指南

FanControl风扇控制&#xff1a;3分钟掌握专业级Windows散热管理终极指南 【免费下载链接】FanControl.Releases This is the release repository for Fan Control, a highly customizable fan controlling software for Windows. 项目地址: https://gitcode.com/GitHub_Tren…...