操作符详解(1)
1. 操作符分类:
算术操作符
移位操作符
位操作符
赋值操作符
单目操作符
关系操作符
逻辑操作符
条件操作符
逗号表达式
下标引用、函数调用和结构成员
2. 算术操作符
+ - * / %
1. 除了 % 操作符之外,其他的几个操作符可以作用于整数和浮点数。
2. 对于 / 操作符如果两个操作数都为整数,执行整数除法。而只要有浮点数执行的就是浮点数除法。
3. % 操作符的两个操作数必须为整数。返回的是整除之后的余数。
3. 移位操作符
<< 左移操作符
>> 右移操作符
注:移位操作符的操作数只能是整数。
移位操作符移动的是二进制的位。
整数的二进制表示形式有三种:原码,反码,补码。
原码:按照数值的正负,直接写出的二进制序列就是原码,一个整数4个字节,32个bit位,一个整数的二进制序列就是32个bie位。对于有符号的整数来说,最高位是符号位,0为正数,1为负数。对于无符号整数来说,没有符号位,所有位都是有效位。
反码:反码的符号位不变,其他位按位取反。
补码:反码的二进制+1得到补码。
对于正整数来说,原码,反码,补码相同,无需计算。
对于负整数来说,原码,反码,补码需要计算。
不管是正整数还是负整数,在内存中存储的都是补码的二进制序列。
整数在计算的时候使用的也是补码。
10
原码:00000000 00000000 00000000 00001010
反码:00000000 00000000 00000000 00001010
补码:00000000 00000000 00000000 00001010
-10
原码:10000000 00000000 00000000 00001010
反码:11111111 11111111 11111111 11110101
补码:11111111 11111111 11111111 11110110
3.1 左移操作符
移位规则:
左边抛弃、右边补0.
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{//左移操作:左边丢弃,右边补0//00000000000000000000000000000111int m = 7;int n = m << 1;//00000000000000000000000000001110printf("%d\n", m);printf("%d\n", n);return 0;
}
在左移后m的值还是7,m只是参与运算,<<操作符有*2的类似效果。
负数:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{//左移操作:左边丢弃,右边补0//原码:10000000000000000000000000000111//负数要计算补码//反码:11111111111111111111111111111000//补码:11111111111111111111111111111001int m = -7;int n = m << 1;//左移后:11111111111111111111111111110010//打印出来的是原码,所以我们计算左移后的原码,-1取反得到原码//11111111111111111111111111110001//10000000000000000000000000001110printf("%d\n", m);printf("%d\n", n);return 0;
}
左移操作符可以使得一些二进制数字来到我们想要的地方。
3.2 右移操作符
移位规则:
首先右移运算分两种:
1. 逻辑移位
左边用0填充,右边丢弃
2. 算术移位
左边用原该值的符号位填充,右边丢弃
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{int a = -10;//原码:10000000 00000000 00000000 00001010//反码:11111111 11111111 11111111 11110101//补码:11111111 11111111 11111111 11110110int b = a >> 1;//逻辑位移:01111111 11111111 11111111 11111011//算数位移:11111111 11111111 11111111 11111011//反码:11111111 11111111 11111111 11111010//原码:10000000 00000000 00000000 00000101-> -5printf("a=%d\n", a);printf("b=%d\n", b);return 0;
}
使用逻辑位移还是算术位移取决的是编译器,大部分是算术右移,逻辑右移太简单粗暴。
右移有类似除2的效果。
警告⚠:
对于移位运算符,不要移动负数位,这个是标准未定义的。
例如:
int num = 10;
num>>-1;//error
4. 位操作符
位操作符有:
& //按位与
| //按位或
^ //按位异或
注:他们的操作数必须是整数。
&运算,用补码进行运算,对应的二进制位有0则为0,两者为1才为1。
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{int a = 3;int b = -5;int c = a & b;//按(2进制)位与//00000000000000000000000000000011 --- 3的补码//10000000000000000000000000000101 //11111111111111111111111111111010//11111111111111111111111111111011 --- -5的补码//00000000000000000000000000000011 --- 3的补码//00000000000000000000000000000011printf("%d\n", c);return 0;
}
&的特点是得到某一个你想要的位。任何数字&1得到的他二进制位的最后一位。配合移位操作符将我们想要的二进制数字移位到最后一位,&1就可以得到这一位。
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{int a = 3;//如果想要得到3的最低位//a&1//00000000000000000000000000000011 --- 3的补码//00000000000000000000000000000001 ---1的补码//遇到0则为0,3的最低位之前的所有位都会变成0,如果结果是0,表示3的最低位是0,如果结果是1,3的最低位就是1return 0;
}
| 运算:
用补码进行运算,对应的二进制位有1则为1,两者为0才为0。
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{int a = 3;int b = -5;//00000000000000000000000000000011 --- 3的补码//10000000000000000000000000000101 //11111111111111111111111111111010//11111111111111111111111111111011 --- -5的补码int c = a | b;//00000000000000000000000000000011 --- 3的补码//11111111111111111111111111111011 --- -5的补码//11111111111111111111111111111011 //11111111111111111111111111111010//10000000000000000000000000000101 -5printf("%d\n", c);return 0;
}
^操作符:
相同为0,相异为1.\
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{int a = 3;int b = -5;//00000000000000000000000000000011 --- 3的补码//10000000000000000000000000000101 //11111111111111111111111111111010//11111111111111111111111111111011 --- -5的补码int c = a ^ b;//00000000000000000000000000000011//11111111111111111111111111111011//11111111111111111111111111111000//10000000000000000000000000000111//10000000000000000000000000001000//printf("%d\n", c);return 0;
}
接下来我们看一道面试题:不创建临时变量,实现两个数的交换。
这个代码存在缺陷,变量的值如果太大就出问题了。
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
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;
}
这个代码使用^操作符来实现,但是这种方法的效率不是很高,创建临时变量是最好的。
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{int a = 3;int b = 5;int c = 0;//中间变量printf("a=%d b=%d\n", a, b);a = a ^ b;//a = 3^5b = a ^ b;//b=3^5^5 b=3a = a ^ b;//a= 3^5^3^5^5 a=5printf("a=%d b=%d\n", a, b);return 0;
}
5. 赋值操作符
赋值操作符是一个很棒的操作符,他可以让你得到一个你之前不满意的值。也就是你可以给自己重新赋值。
int weight = 120;//体重
weight = 89;//不满意就赋值
double salary = 10000.0;
salary = 20000.0;//使用赋值操作符赋值
赋值操作符可以连续使用,比如:
int a = 10;
int x = 0;
int y = 20;
a = x = y+1;//连续赋值
这样的代码感觉怎么样?
那同样的语义,你看看:
x = y+1;
a = x;
这样的写法是不是更加清晰爽朗而且易于调试
复合赋值符
+=
-=
*=
/=
%=
>>=
<<=
&=
|=
^=
这些运算符都可以写成复合的效果。
比如:
int x = 10;
x = x+10;
x += 10;//复合赋值
//其他运算符一样的道理。这样写更加简洁。
6. 单目操作符
6.1 单目操作符介绍
单目操作符就是只有一个操作数。
! 逻辑反操作
- 负值
+ 正值
& 取地址
sizeof 操作数的类型长度(以字节为单位)
~ 对一个数的二进制按位取反
-- 前置、后置--
++ 前置、后置++
* 间接访问操作符(解引用操作符)
(类型) 强制类型转换
!可以把假变成真,把真变成假。
&是取地址操作符,用指针变量来存储。
*是解引用操作符,*x是通过x中存放的地址,知道x指向的对象。
sizeof其实我们之前已经见过了,可以求变量(类型)所占空间的大小。
前置++:计算口诀:先+1,后使用。
后置++:口诀:先使用,后+1。
--跟++是一样的。
6.2 sizeof 和 数组
数组传参是是首元素地址,是指针,地址的大小在32位平台是4个字节,64位平台是8个字节。
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include <stdio.h>
void test1(int arr[])
{printf("%d\n", sizeof(arr));//(2)
}
void test2(char ch[])
{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);test2(ch);return 0;
}
7. 关系操作符
>
>=
<
<=
!= 用于测试“不相等”
== 用于测试“相等
这些关系运算符比较简单,没什么可讲的,但是我们要注意一些运算符使用时候的陷阱。
警告:
在编程的过程中== 和=不小心写错,导致的错误。
8. 逻辑操作符
&& 逻辑与
|| 逻辑或
&&都真才为真,||一个为真就是真。
360笔试题
#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\n b = %d\n c = %d\nd = %d\n", a, b, c, d);
return 0;
}
a++,a首先是0,所以这个表达式都为假,后面的不需要算了,所以只有a+1了,其他没变,i=0。
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#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\n b = %d\n c = %d\n d = %d\n i = %d\n", a, b, c, d,i);return 0;
}
这里有一个数不为0则为真,所以都要运算,i=1.
今天的分享到这里就结束啦!谢谢老铁们的阅读,让我们下期再见。
相关文章:
操作符详解(1)
1. 操作符分类: 算术操作符 移位操作符 位操作符 赋值操作符 单目操作符 关系操作符 逻辑操作符 条件操作符 逗号表达式 下标引用、函数调用和结构成员 2. 算术操作符 - * / % 1. 除了 % 操作符之外,其他的几个操作符可以作用于整数和浮点数。 2. 对…...
<指针进阶>指针数组和数组指针傻傻分不清?
✨Blog:🥰不会敲代码的小张:)🥰 🉑推荐专栏:C语言🤪、Cpp😶🌫️、数据结构初阶💀 💽座右铭:“記住,每一天都是一個新的開始…...
无代码集成飞书连接更多应用
场景描述: 基于飞书开放平台能力,无代码集成飞书连接更多应用,打通数据孤岛。通过Aboter可轻松搭建业务自动化流程,实现多个应用之间的数据连接。 支持包括飞书事件监听和接口调用的能力: 事件监听: 用…...
三分钟解决AE缓存预览渲染错误、暂停、卡顿问题
一、清除RAM缓存(内存) 你应该做的第一件事是清除你的RAM。这将清除当前存储在内存中的所有临时缓存文件。要执行此操作,请导航到编辑>清除>所有内存。这将从头开始重置RAM缓存 二、清空磁盘缓存 您也可以尝试清空磁盘缓存。执行此操作…...
朴实无华的数据增强然后训练一下应用在电网异物检测领域,好像有自己的数据集就能发文了
RCNN-based foreign object detection for securing power transmission lines (RCNN4SPTL) Abstract 本文提出了一种新的深度学习网络——RCNN4SPTL (RCNN -based Foreign Object Detection for Securing Power Transmission lines),该网络适用于检测输电线路上的…...
【使用教程】在Ubuntu下运行CANopen通信PMM伺服电机使用教程(NimServoSDK_V2.0.0)
本教程将指导您在Ubuntu操作系统下使用NimServoSDK_V2.0.0来运行CANopen通信的PMM系列一体化伺服电机。我们将介绍必要的步骤和命令,以确保您能够成功地配置和控制PMM系列一体化伺服电机。 NimServoSDK_V2.0.0是一款用于PMM一体化伺服电机的软件开发工具包。它提供了…...
vue3+ts+vite项目页面初始化loading加载效果
简介 一分钟实现 vue-pure-admin 同款项目加载时的 loading 效果 一、先看效果 1.1 静态效果 1.2 动态效果 二、上代码 核心代码在body里面,代码中已标明。找到你项目的 index.html ,复制粘贴进去即可 <!DOCTYPE html> <html lang"en…...
ElasticSearch 数据聚合、自动补全(自定义分词器)、数据同步
文章目录 数据聚合一、聚合的种类二、DSL实现聚合1、Bucket(桶)聚合2、Metrics(度量)聚合 三、RestAPI实现聚合 自动补全一、拼音分词器二、自定义分词器三、自动补全查询四、实现搜索款自动补全(例酒店信息࿰…...
神经网络基础-神经网络补充概念-18-多个样本的向量化
概念 多个样本的向量化通常涉及将一组样本数据组织成矩阵形式,其中每一行代表一个样本,每一列代表样本的特征。这种向量化可以使你更有效地处理和操作多个样本,特别是在机器学习和数据分析中。 代码实现 import numpy as np# 多个样本的数…...
*看门狗1
//while部分是我们在项目中具体需要写的代码,这部分的程序可以用独立看门狗来监控 //如果我们知道这部分代码的执行时间,比如是500ms,那么我们可以设置独立看门狗的 //溢出时间是600ms,比500ms多一点,如果要被监控的程…...
nginx防盗链
防盗链介绍 通过二次访问,请求头中带有referer,的方式不允许访问静态资源。 我们只希望用户通过反向代理服务器才可以拿到我们的静态资源,不希望别的服务器通过二次请求拿到我们的静态资源。 盗链是指在自己的页面上展示一些并不在自己服务…...
8月16日上课内容 第二章 部署LVS-DR群集
本章结构: 数据包流向分析: 数据包流向分析: (1)客户端发送请求到 Director Server(负载均衡器),请求的数据报文(源 IP 是 CIP,目标 IP 是 VIP)到达内核空间。 …...
ViT模型架构和CNN区别
目录 Vision Transformer如何工作 ViT模型架构 ViT工作原理解析 步骤1:将图片转换成patches序列 步骤2:将patches铺平 步骤3:添加Position embedding 步骤4:添加class token 步骤5:输入Transformer Encoder 步…...
发布python模仿2023年全国职业的移动应用开发赛项样式开发的开源的新闻api,以及安卓接入案例代码
python模仿2023年全国职业的移动应用开发赛项样式开发的开源的新闻api,以及原生安卓接入案例代码案例 源码地址:keyxh/newsapi: python模仿2023年全国职业的移动应用开发赛项样式开发的开源的新闻api,以及安卓接入案例代码 (github.com) 目录 1.环境配…...
adb command
查看屏幕分辨率 adb shell wm size 查看dpi adb shell dumpsys window | grep ‘dpi’ WIFI调试: adb tcpip 5555adb connect 设备ip 注意,USB拔插会断掉,所以插上USB后再 adb connect 设备ip。【注意】华为手机自建热点的ip一般是192.1…...
在ARM服务器上一键安装Proxmox VE(以在Oracle Cloud VPS上为例)(甲骨文)
前言 如题,具体用到的说明文档如下 virt.spiritlhl.net 具体流程 首先是按照说明,先得看看自己的服务器符不符合安装 Proxmox VE的条件 https://virt.spiritlhl.net/guide/pve_precheck.html#%E5%90%84%E7%A7%8D%E8%A6%81%E6%B1%82 有提到硬件和软…...
KMP算法(JS)
KMP算法 什么时KMP算法 KMP算法是一种改进的字符串匹配算法 由D.E.Knuth,J.H.Morris和 V.R.Pratt提出的,因此人们称它为克努特—莫里斯—普拉特操作(简称KMP算法)。 KMP的主要思想是当出现字符串不匹配时,可以知道…...
恢复NuGet包_解决:System.BadImageFormatException:无法加载文件或程序集
C#工程 主要是开发了一个 web api接口,这个工程源码去年还可以的,今年换了一个电脑打开工程就报错。 错误提示如下: 在 Microsoft.CodeAnalysis.CSharp.CommandLine.Program.Main(String[] args) Test1 System.BadImageFormatEx…...
Django学习笔记(2)
创建app 属于自动执行了python manage.py 直接在里面运行startapp app01就可以创建app01的项目了 之后在setting.py中注册app01 INSTALLED_APPS ["django.contrib.admin","django.contrib.auth","django.contrib.contenttypes","django.c…...
高德地图开发者平台Python应用实践:快速入门周边商业环境信息查询
高德地图开发平台提供了丰富的API接口,可以方便地进行地图数据的开发和分析。在商业分析数据采集中,使用高德地图开发平台的周边查询功能可以快速获取周边商圈、小区等信息,为商业决策提供数据支持。 针对您的需求,我建议采用以下…...
【ES6】—let 声明方式
一、不属于顶层对象window let 关键字声明的变量,不会挂载到window的属性 var a 5 console.log(a) console.log(window.a) // 5 // 5 // 变量a 被挂载到window属性上了 , a window.alet b 6 console.log(b) console.log(window.b) // 6 // undefin…...
【数据分析入门】Jupyter Notebook
目录 一、保存/加载二、适用多种编程语言三、编写代码与文本3.1 编辑单元格3.2 插入单元格3.3 运行单元格3.4 查看单元格 四、Widgets五、帮助 Jupyter Notebook是基于网页的用于交互计算的应用程序。其可被应用于全过程计算:开发、文档编写、运行代码和展示结果。 …...
反射知识总结
1、反射概述 反射是指对于任何一个Class类,在"运行的时候"都可以直接得到这个类全部成分。在运行时,可以直接得到这个类的构造器对象:Constructor在运行时。可以直接得到这个类的成员变量对象:Field在运行时,…...
MongoDB 安装 linux
本文介绍一下MongoDB的安装教程。 系统环境:CentOS7.4 可以用 cat /etc/redhat-release 查看本机的系统版本号 一、MongoDB版本选择 当前最新的版本为7.0,但是由于7.0版本安装需要升级glibc2.25以上,所以这里我暂时不安装该版本。我们选择的是6.0.9版本…...
什么是KNN( K近邻算法)
什么是KNN( K近邻算法) 虽然名字中有NN,KNN并不是哪种神经网络,它全名K-Nearest-Neighbors:K近邻算法,是机器学习中常用的分类算法。 物以类聚,人以群分。KNN的基础思想很简单,要判断一个新数据的类别&…...
Linux查看命令总结
1.动态实时查找命令 使用以下命令的前提是需要在找到日志位置 tail -f server.log 实时展示日志末尾内容,默认最后10行,相当于增加参数 -n 10 tail -n filename; tail命令扩展 查看日志最后20行内容并实时更新日志 tail -f -n 20 server.log或者 tail -fn 20 ser…...
npm报错 Cannot find module ‘@vuepress\core\node_m
通常是由于缺少依赖包或者依赖包版本不兼容引起的。可以尝试以下步骤来解决这个问题: 确保您的项目的依赖包是最新的,可以运行 npm update 命令来更新依赖包。 如果更新依赖包后仍然有问题,可以尝试删除 node_modules 文件夹,并重…...
mybatis入门环境搭建及CRUD
一、MyBatis介绍 1.1 MyBatis的定义 MyBatis是一个开源的Java持久化框架,它可以帮助开发人员简化数据库访问的过程。它提供了一种将SQL语句与Java代码进行映射的方式,使得开发人员可以通过简单的配置文件来定义SQL语句,而无需编写繁琐的JDB…...
小程序变化历史记录
2023年8月26 小程序机号快速验证组件将需要付费使用 自2023年8月26日起,手机号快速验证组件将需要付费使用。标准单价为:每次组件调用成功,收费0.03元 https://blog.csdn.net/qq_37215621/article/details/131453551 自2023年9月1日起&…...
jstack(Stack Trace for Java)Java堆栈跟踪工具
jstack(Stack Trace for Java)Java堆栈跟踪工具 jstack(Stack Trace for Java)命令用于生成虚拟机当前时刻的线程快照(一般称为threaddump或者javacore文件)。 线程快照就是当前虚拟机内每一条线程正在执…...
武汉科技公司排名/东莞优化网站关键词优化
:2014年继续教育心得体会,我认真参加了教师继续教育,学习了《中小学教师信息技术与学科教学融合》、《师者之魂》、《教师积极心理健康的培,较好的完成了本年度的继续教育学习任务,教师专业是动态发展的、终身持续的过程,现代教学应是建立在教师学习基础上的,必须在加强和发展教…...
上海网站seoseodian/seo词库排行
Delphi Live Bindings 初探 Live Bindings,顾名思义,动态绑定。 1、绑定前: 2、点击数据源: 3、绑定连线:点击 蓝色区域, 按住 鼠标左键,一直移动到绿色区域,然后松掉鼠标左键。 系统…...
做网站虚拟主机推荐/怎么创建一个网页
Linux课上的作业周三交,若有考虑不周到的地方,还请多多不吝赐教。shell处理文本相关的经常使用命令见此博客##假设输入两个參数 则第一个为统计单词的个数。第二个为要统计的文章#假设输入一个參数 则默认统计单词的个数为10#详细思路:将各种…...
wordpress最近更新模块/哪个公司做网站推广最好
偶然间发现了Redis的这本书,和拥有这本书的网站,感觉相当不错,一个突来的亮点,记录下来以后慢慢看。 The goal of this book is to build the foundation you’ll need to master Redis. We’ll focus on learning Redis’ five …...
中央人民政府网站谢芳友高层访问/怎么开发自己的小程序
背景与文献简介可充电锌金属电池作为锂离子电池的潜在替代品,由于其成本低、容量大、使用安全的水系电解质的优势,近年来引起了广泛的关注。然而,在充电过程中,枝晶生长会导致电池性能退化,并增大电池的安全风险。近日…...
wordpress 视频展示/网站关键词如何优化上首页
1.存储结构:数据库database 表table 数据data;2.SQL(Structured Query Language,结构化查询语言)语言:和数据库交互的语言,进行数据库管理的语言。库的操作3.查询所有数据库:show databases;4.创建数据库 create …...