c语言操作符
目录
运算符
移位操作符
左移操作符
右移操作符
位操作符
按位与&
按位或|
按位异或^
异或交换数字
计算二进制中1的个数
关系操作符
逻辑操作符
条件操作符
逗号表达式
下标引用、函数调用和结构成员
隐式类型转换
整形提升实例:
算术转换
操作符属性
问题表达式
运算符
加减乘除没什么好说的,注意除法计算除号两边至少有一个数为小数时才进行小数运算,否则为整形计算,%操作符必须进行整形运算,得到的余数只能是整形。
移位操作符
移位操作符是对二进制位进行移位,(int)为32位比特位,(char)为8个比特位...在计算机中变量是以补码形式存放在内存中的。而移位操作是在此基础上进行的。
补充原反补码相关知识:
正数的原、反、补码相同。(为了方便做减法)
无符号数没有原、反、补码。
补码 = 原码取反(反码) +1
反码:除符号位其他位取反
原码 = 补码取反 + 1 or 补码-1再取反
左移操作符
有符号:算数移位,左边丢弃,左边补符号位
无符号:逻辑移位,左边丢弃,左边补0
这里为了省功夫,我们用字符类型来演示:
char a = 4;00000100//原码
01111100//补码
printf("%d",a<<1);//01111000补码
//打印:00001000 8//原码
左移本身并没有改变a的值。打印结果显示的是原码的值,而实际各种运算都是对补码进行操作。
右移操作符
有符号:算数右移,右边丢弃,左边补符号位
无符号:逻辑右移,右边丢弃,左边补0
归纳:正数补0,负数补1
一样的道理,右移操作符使值减少到了原来的一半,而左移是扩大2倍,原理参考2进制转换成10进制。
注意:不要移动负数位,这样的结果是未定义的。(a>>-1)
位操作符
操作对象:二进制位的整数
按位与&
有0为0,全为1才为1
巧记:可以理解成&&操作符,0&&1为1 1&&1为1
3 & 5//char
//原码
00000011
00000101
//补码
01111101
01111011
01111001 //3&5
//原码输出:00000111//7
按位或|
有1为1,全为0才为0
巧记:可以理解成||操作符,0||1为1 0||0为0
按位异或^
相同为0,相异为1
巧记:可以联想哲学道理:世界上没有两片相同的树叶,相同是悖论为0,相异为真理为1。
异或交换数字
有没有一种不需要中间变量就能交换两个数的方法呢?异或或许能做到这一点。
常规做法
int a = 3;int b = 5;a = b + a - a;b = b + a - b;
这种做法可能出现数字大的时候导致溢出,我们可以改进一下:
// 5^5 = 0
// 0^5 = 5
//3^5^5 = 3^0 = 3;
int a = 3;
int b = 5;
a = a ^ b;
b = a ^ b;
a = b ^ a;
由于0和任何数异或都为这个数本身(相异),而自己异或自己为0(相同),这使得我们交换数字是存在一种有趣的加密解密效应,但无疑使得代码可读性大大降低,所以一般不推荐这样交换数字。
计算二进制中1的个数
我们可以使用移位操作符,依次将该数的比特位进行移动,再通过与1按位与进行判断(按位异或也可)。
00000001//1
00010010 >>
00000011 >>
按位与在遇到1结果为1,遇到0时结果为0,这样能区分0和1,异或也是同理。
int n = 8;unsigned int sz = sizeof(n);//非负整数int bit_num = sz * 8;//计算比特位int sum = 0;int i = 0;for (i = 0; i < bit_num; i++){if (1 & (n>>i))sum++;}printf("%d\n", sum);// 01000// 00001
结果输出1,记住移位并不会直接改变数字大小,所以得在判断时调整。
关系操作符
> 、==、<、>=、<=像这样的操作符叫做条件操作符。
注意:
关系操作符不能比较两个结构体大小,但可以比较其成员变量的大小。
不能比较两个字符串大小,因为比较的是两个字符串首元素地址。
逻辑操作符
&&和||代表逻辑操作符,对于&&,如果其中一个条件为假,就跳出判断,对于||,如果其中一个条件为真,则跳出判断,这是逻辑操作符的短路与断路现象。

真返回1,假返回0
条件操作符
exp1?exp2:exp3
三目操作符:真返回第二个表达式,假返回第三个表达式
逗号表达式
从左往右依次计算,最后一个表达式的值为表达式的结果
int a = 2;int b = 0;int c = (a > b, a = b + 10, a, b = a + 1);printf("%d %d %d\n", a,b,c);
这个表达式的值为多少呢?
答案是:10 11 11,大家可以自己算算。
a = get_val();count_val(a);while (a > 0){a = get_val();count_val(a);}
这段代码重复的部分除了可以用do...while循环改写还可以用逗号表达式改写:
while (a = get_val(), count_val(a), a > 0){//业务处理}
将需要先处理的代码用逗号表达式放到while()里,是一种很巧妙的做法。
下标引用、函数调用和结构成员
下标引用:[]
函数调用:
void test1(int x, int y)
{}
void test2()
{}
int main()
{test1(3, 4);//操作数(),3,4test2();//操作数()
结构成员
- 结构体.成员变量
- 结构体指针->成员变量
struct book
{char name[10];int price;
};
int main()
{struct book s1 = { "wei",30 };struct book* s2 = &s1;//不能为空printf("%s %d\n", s1.name, s1.price);printf("%s %d", s2->name, s2->price);
隐式类型转换
表达式的整型运算要在CPU的相应运算器件内执行,CPU内整型运算器(ALU)的操作数的字节长度一般就是int的字节长度,所以当计算对象小于int(4字节)时,会发生整型提升。
char a = 5; //00000101
char b = 126;//01111110
char c = a + b;
//整型提升000000000000000000000000000001010000000000000000000000000111111000000000000000000000000010000011
当把计算的结果存到c中去时,会发生截断,因为char只能存8个字节。
//截断
10000011
输出时发生整型提升:
printf("%d\n", c);//以整形打印10进制//11111111111111111111111110000011(补码)//打印(原码):10000000000000000000000001111101//-125
注:提升时有符号类型补符号位,无符号类型补0。
截断和提升都是对补码操作。
整形提升实例:
char a = 0xb6;short b = 0xb600;int c = 0xb6000000;if(a==0xb6)printf("a");if(b==0xb600)printf("b");if(c==0xb6000000)printf("c");
a:1011 0110->11111111111111111111111110110110
只输出结果c,因为a,b发生整形提升,负数取原码后,原来的值也发生了改变。
当用sizeof去对小于4字节的变量进行表达式计算时,自己也会为4字节。
算术转换
如果某个操作符的各个操作数属于不同类型,就会发生算数转换,算数转换按照如下优先级顺序转换:
long double
double
float
unsigned long int
long int
unsigned int
int
当然,如果转换顺序不合理,将会出现精度丢失等情况。
float f = 3.14//float = double
int num = f;//隐式转换
操作符属性
1. 操作符的优先级
2. 操作符的结合性(从左向右、从右向左、无顺序)
3. 是否控制求值顺序(三目操作符、&&、||等)
大家可以自行查表记忆它们的特点和顺序,不需要死记硬背,用到时即可查阅。
问题表达式
int main()
{int i = 10;i = i-- - --i * ( i = -3 ) * i++ + ++i;printf("i = %d\n", i);return 0;
}
像这样不知道哪一步该执行,不同编译器的处理也是不同的,所以我们书写代码的时候尽量降低复杂性,提高可读性。
相关文章:
c语言操作符
目录 运算符 移位操作符 左移操作符 右移操作符 位操作符 按位与& 按位或| 按位异或^ 异或交换数字 计算二进制中1的个数 关系操作符 逻辑操作符 条件操作符 逗号表达式 下标引用、函数调用和结构成员 隐式类型转换 整形提升实例: 算术转换 操作…...
python爬虫5:requests库-案例3
python爬虫5:requests库-案例3 前言 python实现网络爬虫非常简单,只需要掌握一定的基础知识和一定的库使用技巧即可。本系列目标旨在梳理相关知识点,方便以后复习。 申明 本系列所涉及的代码仅用于个人研究与讨论,并不会对网…...
uni-app:实现点击按钮,进行数据累加展示(解决数据过多,导致出错)
效果 代码 核心代码 一、标签显示 <!-- 加载更多 --> <view class"load_more" v-if"info.length > pageNum * pageSize" tap"loadMore">加载更多 </view> v-if"info.length > pageNum * pageSize"…...
群晖6.X便捷的安装cpolar内网穿透
群晖6.X便捷的安装cpolar内网穿透 文章目录 群晖6.X便捷的安装cpolar内网穿透前言1. 下载cpolar的群晖套件1.1 打开群晖套件中心1.2 选择“手动安装”1.3 选择下载cpolar套件位置 2. 打开cpolar的Web-UI界面3. 注册会员 前言 随着硬件设备和软件技术的发展,以及数据…...
ffmpeg 4.4版本对MP4文件进行AES-CTR加密,和流式加密
对于ffmpeg的AES-CTR加密有两种方式,一个是普通的整个视频做加密,另一个是对视频做切片处理,然后进行加密。 一、对于普通的加密方式 直接使用下面的命令就行 ffmpeg -i animal.mp4 -vcodec copy -acodec copy -encryption_scheme cenc-aes…...
软件测试基础篇——Docker
1、docker技术概述 docker描述:docker是一项虚拟化的容器技术(类似于虚拟机),docker技术给使用者提供一个平台,在该平台上可以利用提供的容器,对每一个应用程序进行单独的封装隔离,每一个应用程…...
MySQL刷题遇到的盲点(五)窗口函数
窗口函数 语法: <窗口函数> over (partition by <用于分组的列名>order by <用于排序的列名>) partition by:用来对表分组( partition 子句可以省略,省略就是不指定分组) order by:是…...
【java】基础——多态
多态基本知识思维导图 多态的代码实现,注意父类对象引用指向子类对象引用(向上转型)的方法,父类就可以调用子类重写的方法和派生的方法,但不能调用子类特有的方法: class Animal {public void makeSound()…...
Go语言使用cron/v3实现定时任务
一、获取cron/v3包 go get github.com/robfig/cron/v3v3.0.0安装v3版本的cron包。 二、创建cron调度器 使用cron.New()创建一个新的Cron调度器: c : cron.New()三、添加定时任务 使用AddFunc方法添加定时任务,参数是cron表达式和任务函数: c.AddFunc("* * * * *&quo…...
photoshop PS 查看像素坐标、像素颜色、像素HSB颜色
方法一 photoshop 菜单栏 窗口菜单->信息菜单项(F8), 在信息窗口里会有当前的 x,y坐标 方法二 photoshop 菜单栏 视图菜单->标尺菜单项(ctrlR) 宽度和高度边上都有标尺,默认的是厘米,右键单机宽度和高度边上…...
SpringCloud实用篇3----Docker
1.初识Docker 1.1 什么是Docker 微服务虽然具备各种各样的优势,但服务的拆分通用给部署带来了很大的麻烦。 分布式系统中,依赖的组件非常多,不同组件之间部署时往往会产生一些冲突。在数百上千台服务中重复部署,环境不一定一致…...
使用阿里云服务器搭建Discuz论坛网站教程基于CentOS系统
阿里云百科分享使用阿里云服务器建站教程,本文是搭建Discuz论坛,Discuz!是一款通用的社区论坛软件系统,它采用PHP和MySQL组合的基础架构,为您提供高效的论坛解决方案。本文介绍如何在CentOS 7操作系统的ECS实例上搭建Discuz! X3.4…...
gitee(码云)如何生成并添加公钥配置用户信息
一,简介 在使用Gitee的时候,公钥是必须的,无论是克隆还是上传。本文主要介绍如何本地生成和添加公钥到服务器,然后配置自己的用户信息,方便日后拉取与上传代码。 二,步骤介绍 2.1 本地生成公钥 打开git ba…...
C++QT教程3——手册4.11.1自带教程(笔记)——创建一个QT快速应用
文章目录 创建一个QT快速应用创建项目创建主视图添加应用逻辑为视图添加动画素材文件 参考文章 创建一个QT快速应用 本教程使用内置的QML类型,介绍了Qt Quick的基本概念。有关可以选择的用户界面选项的更多信息,请参阅用户界面。 本教程描述了如何使用…...
用友时空KSOA SQL注入漏洞复现(HW0day)
0x01 产品简介 用友时空KSOA是建立在SOA理念指导下研发的新一代产品,是根据流通企业最前沿的I需求推出的统一的IT基础架构,它可以让流通企业各个时期建立的IT系统之间彼此轻松对话,帮助流通企业保护原有的IT投资,简化IT管理&#…...
java中编写代码:如何以sftp的形式把文件从服务器上面下载下来?(有账号和密码)
在Java中,你可以使用JSch库来实现通过SFTP协议下载文件。以下是一个简单的示例代码: import com.jcraft.jsch.Channel; import com.jcraft.jsch.ChannelSftp; import com.jcraft.jsch.JSch; import com.jcraft.jsch.Session; public class SFTPDownloa…...
【24择校指南】南京大学计算机考研考情分析
南京大学(A) 考研难度(☆☆☆☆☆) 内容:23考情概况(拟录取和复试分数人数统计)、院校概况、23初试科目、23复试详情、参考书目、各科目考情分析、各专业考情分析。 正文2178字,预计阅读:6分…...
IL汇编 ldarg 指令学习
IL汇编代码, .assembly extern mscorlib {} .assembly MathLib {.ver 1 : 0 : 1 : 0 }.module MathLib.dll.namespace MyMath { .class public ansi auto MathClass extends [mscorlib]System.Object{ .method public int32 GetSquare(int32) c…...
【ARM Cache 系列文章 9 番外篇 -- ARMv9 系列 Core 介绍】
文章目录 ARMv9 系列CoreARM Cortex-A510 介绍ARM Cortex-A715ARM Cortex-A720 ARMv9 系列Core 2021年5月Arm公布了其最新3款CPU和3款GPU核心设计,三款新CPU分别是旗舰核心Cortex-X2、高性能核心Cortex-A710、高能效核心Cortex-A510 CPU,三款新GPU核心则…...
章节7:Burp Intruder模块
章节7:Burp Intruder模块 参考资料 https://portswigger.net/burp/documentation/desktop/tools/intruder 01 Intruder模块作用与原理 原理 http://xxx.xx.com/bbs/index.php?namewuyanzu&mottogo 对请求参数进行修改,分析响应内容࿰…...
使用VSCode开发Django指南
使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架,专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用,其中包含三个使用通用基本模板的页面。在此…...
Xshell远程连接Kali(默认 | 私钥)Note版
前言:xshell远程连接,私钥连接和常规默认连接 任务一 开启ssh服务 service ssh status //查看ssh服务状态 service ssh start //开启ssh服务 update-rc.d ssh enable //开启自启动ssh服务 任务二 修改配置文件 vi /etc/ssh/ssh_config //第一…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院查看报告小程序
一、开发环境准备 工具安装: 下载安装DevEco Studio 4.0(支持HarmonyOS 5)配置HarmonyOS SDK 5.0确保Node.js版本≥14 项目初始化: ohpm init harmony/hospital-report-app 二、核心功能模块实现 1. 报告列表…...
学习STC51单片机31(芯片为STC89C52RCRC)OLED显示屏1
每日一言 生活的美好,总是藏在那些你咬牙坚持的日子里。 硬件:OLED 以后要用到OLED的时候找到这个文件 OLED的设备地址 SSD1306"SSD" 是品牌缩写,"1306" 是产品编号。 驱动 OLED 屏幕的 IIC 总线数据传输格式 示意图 …...
数据库分批入库
今天在工作中,遇到一个问题,就是分批查询的时候,由于批次过大导致出现了一些问题,一下是问题描述和解决方案: 示例: // 假设已有数据列表 dataList 和 PreparedStatement pstmt int batchSize 1000; // …...
【OSG学习笔记】Day 16: 骨骼动画与蒙皮(osgAnimation)
骨骼动画基础 骨骼动画是 3D 计算机图形中常用的技术,它通过以下两个主要组件实现角色动画。 骨骼系统 (Skeleton):由层级结构的骨头组成,类似于人体骨骼蒙皮 (Mesh Skinning):将模型网格顶点绑定到骨骼上,使骨骼移动…...
多种风格导航菜单 HTML 实现(附源码)
下面我将为您展示 6 种不同风格的导航菜单实现,每种都包含完整 HTML、CSS 和 JavaScript 代码。 1. 简约水平导航栏 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport&qu…...
Redis数据倾斜问题解决
Redis 数据倾斜问题解析与解决方案 什么是 Redis 数据倾斜 Redis 数据倾斜指的是在 Redis 集群中,部分节点存储的数据量或访问量远高于其他节点,导致这些节点负载过高,影响整体性能。 数据倾斜的主要表现 部分节点内存使用率远高于其他节…...
Mac下Android Studio扫描根目录卡死问题记录
环境信息 操作系统: macOS 15.5 (Apple M2芯片)Android Studio版本: Meerkat Feature Drop | 2024.3.2 Patch 1 (Build #AI-243.26053.27.2432.13536105, 2025年5月22日构建) 问题现象 在项目开发过程中,提示一个依赖外部头文件的cpp源文件需要同步,点…...
九天毕昇深度学习平台 | 如何安装库?
pip install 库名 -i https://pypi.tuna.tsinghua.edu.cn/simple --user 举个例子: 报错 ModuleNotFoundError: No module named torch 那么我需要安装 torch pip install torch -i https://pypi.tuna.tsinghua.edu.cn/simple --user pip install 库名&#x…...
