c语言操作符

news2024/11/26 8:39:49

目录

运算符 

 移位操作符

左移操作符

右移操作符

位操作符

 按位与&

 按位或|

按位异或^

异或交换数字

计算二进制中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,4
	test2();//操作数()

结构成员

  • 结构体.成员变量
  • 结构体指针->成员变量
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;
//整型提升
	00000000000000000000000000000101
    00000000000000000000000001111110
	00000000000000000000000010000011

 当把计算的结果存到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;
}

像这样不知道哪一步该执行,不同编译器的处理也是不同的,所以我们书写代码的时候尽量降低复杂性,提高可读性

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

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

相关文章

2023企业微信0day漏洞复现以及处理意见

2023企业微信0day漏洞复现以及处理意见 一、 漏洞概述二、 影响版本三、 漏洞复现小龙POC检测脚本: 四、 整改意见 免责声明&#xff1a;请勿利用文章内的相关技术从事非法测试&#xff0c;由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失&#x…

【从零开始学Kaggle竞赛】泰坦尼克之灾

目录 0.准备1.问题分析挑战流程数据集介绍结果提交 2.代码实现2.1 加载数据2.1.1 加载训练数据2.1.2 加载测试数据 2.2 数据分析2.3 模型建立与预测 3.结果提交 0.准备 注册kaggle账号后&#xff0c;进入titanic竞赛界面 https://www.kaggle.com/competitions/titanic 进入后界…

一、初始 Spring MVC

文章目录 一、回顾 MVC 模式二、初始 Spring MVC2.1 Spring MVC 核心组件2.1.1 前端控制器&#xff08;DispatcherServlet&#xff09;2.1.2 处理器映射器&#xff08;HandlerMapping&#xff09;2.1.3 处理器适配器&#xff08;HandlerAdapter&#xff09;2.1.3 后端控制器&am…

Go Web--Go Module

目录 一、Go Module 1、开启Go Module 2、Go Module基本操作 3、使用GoLand创建Go Module项目 4、GoLand配置File Watchers 一、Go Module Go Module包管理工具----相当于Maven 1.11版本引入 1.12版本正式支持 告别GOPATH&#xff0c;使用Go Module管理项目&#xff0c…

uniapp把城市换成26个字母和城市排序

后端返回的数据 我们要得效果 <template><view><view v-for"(value,key) in cities" :key"key"><view style"color: red;"> {{ key }} </view><view style"border: 1rpx solid black;"><tex…

谈谈传感器技术

目录 1.什么是传感器 2.传感器有哪些种类 3.传感器的应用领域 4.传感器对人类生活的影响 5.传感器技术未来的发展趋势 1.什么是传感器 传感器是一种能够感知外部环境和物理量的设备或组件。它们将物理量&#xff08;如温度、压力、湿度、光照、位置等&#xff09;转化为可…

pytorch @操作符

今天发现一个操作符 import torch a torch.tensor([[1,2],[2,3],[5,6]]) b torch.tensor([[2,1],[8,5],[3,2]]) c a*b d a b.t() ## [3,2] [2,3] print(*,c) print(,d)结果如下 import torch# Define matrices A torch.randn(3, 4) B torch.randn(4, 5)# Matrix mult…

详解拦截器和过滤器

目录 代码演示过滤器Demo拦截器Demo 过滤器自定义拦截器配置拦截器过滤器执行原理多个过滤器的执行顺序 拦截器自定义拦截器注册拦截器1&#xff09;注册拦截器2&#xff09;配置拦截的路径3&#xff09;配置不拦截的路径 多个拦截器的执行顺序 过滤器和拦截器的区别 代码演示 …

React Native 列表组件基础知识

ScrollView 组件 ScrollView组件是一个容器滚动组件&#xff0c;当容器超出指定宽高时就可以进行滚动交互。 ScrollView组件是一次性渲染所有的 React 子组件&#xff0c;这在性能上是比较差的&#xff0c;所以不建议当列表特别长的时候使用此组件。 接下来列举几个常用的一…

Elasticsearch的一些基本概念

文章目录 基本概念&#xff1a;文档和索引JSON文档元数据索引REST API 节点和集群节点Master eligible节点和Master节点Data Node 和 Coordinating Node其它节点 分片(Primary Shard & Replica Shard)分片的设定操作命令 基本概念&#xff1a;文档和索引 Elasticsearch是面…

openCV使用c#操作摄像头

效果如下&#xff1a; 1.创建一个winform的窗体项目&#xff08;框架.NET Framework 4.7.2&#xff09; 2.Nuget引入opencv的c#程序包&#xff08;版本最好和我一致&#xff09; 3.后台代码 using System; using System.Collections.Generic; using System.ComponentModel;…

回归预测 | MATLAB实现基于SSA-KELM-Adaboost麻雀算法优化核极限学习机结合AdaBoost多输入单输出回归预测

回归预测 | MATLAB实现基于SSA-KELM-Adaboost麻雀算法优化核极限学习机结合AdaBoost多输入单输出回归预测 目录 回归预测 | MATLAB实现基于SSA-KELM-Adaboost麻雀算法优化核极限学习机结合AdaBoost多输入单输出回归预测预测效果基本介绍模型描述程序设计参考资料 预测效果 基本…

【数据结构】二叉树篇| 纲领思路01+刷题

博主简介&#xff1a;努力学习的22级计算机科学与技术本科生一枚&#x1f338;博主主页&#xff1a; 是瑶瑶子啦每日一言&#x1f33c;: 所谓自由&#xff0c;不是随心所欲&#xff0c;而是自我主宰。——康德 目录 一、二叉树刷题纲领二、刷题1、104. 二叉树的最大深度2、 二叉…

电脑mfc140u.dll丢失的怎么办呢?这个方法亲测可以解决

修复mfc140u.dll是我最近遇到的一个技术问题&#xff0c;虽然在解决过程中遇到了一些困难&#xff0c;但最终的成功修复让我对技术的力量有了更深的体会。 首先&#xff0c;我想谈谈遇到问题时的困惑。当我尝试运行一个应用程序时&#xff0c;突然弹出一个错误提示&#xff0c;…

学习篇之React Fiber概念及原理

什么是React Fibber&#xff1f; React Fiber 是 React 框架的一种底层架构&#xff0c;为了改进 React 的渲染引擎&#xff0c;使其更加高效、灵活和可扩展。 传统上&#xff0c;React 使用一种称为堆栈调和递归算法来处理虚拟 DOM 的更新&#xff0c;这种方法在大型应用或者…

关于MPU6050的VLOGIC引脚作用

关键字&#xff1a;MPU6X0X、 MPU6050、数字逻辑电平、VLOGIC 框图&#xff1a; 一、VLOGIC引脚作用? VLOGIC引脚主要用于设置为I2C供电引脚&#xff0c;以保证正确的I2C通信。 The bias and LDO section generates the internal supply and the reference voltages and cu…

Kafka消息队列学习(一)

文章目录 概述核心概念生产者示例同步 / 异步发送消息生产者参数配置ack-确认机制retries - 重试次数compression_type - 消息压缩类型 分区机制分区策略 消费者消息有序性提交和偏移量偏移量提交方式手动提交 高可用设计 SpringBoot集成Kafka基本使用传递对象消息 概述 核心概…

虚拟机内搭建CTFd平台搭建及CTF题库部署,局域网内机器可以访问

一、虚拟机环境搭建 1、安装docker、git、docker-compose ubuntu&#xff1a; sudo apt-get update #更新系统 sudo apt-get -y install docker.io #安装docker sudo apt-get -y install git #安装git sudo apt-get -y install python3-pip #安装pip3 sudo pip install dock…

最新版彩虹知识付费商城源码 V3.4

介绍 最新彩虹知识付费商城初创体验版&#xff0c;支持二级分类&#xff0c;多级分销&#xff0c;秒杀&#xff0c;砍价&#xff0c;团购&#xff0c;首页继续浏览&#xff0c;分站个人虚拟余额自定义&#xff0c;最新批量对接&#xff0c;批量下载图片&#xff0c;批量替换标…

云开发超多功能工具箱组合微信小程序源码/附带流量主

介绍&#xff1a; 这是一款云开发超多功能工具箱组合微信小程序源码附带流量主功能&#xff0c;小程序内包含了40余个功能&#xff0c;堪称全能工具箱了&#xff0c;大致功能如下&#xff1a; 证件照制作 | 垃圾分类查询 | 个性签名制作 二维码生成丨文字九宫格 | 手持弹幕丨…