C语言 操作符

news2024/10/2 16:16:29

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

算术操作符 

  • 加法(+):执行两个操作数的加法运算。
  • 减法(-):执行两个操作数的减法运算。
  • 乘法(*):执行两个操作数的乘法运算。
  • 除法(/):执行两个操作数的除法运算。如果两个操作数都是整数,则执行整数除法;如果包含浮点数,则执行浮点数除法。
  • 取余(%):获取两个整数操作数相除后的余数。

移位操作符

二进制中有三种表现式原码,反码,补码。内存中存储是补码且移位的也是补码。

     正数的原码,反码,补码是相同的
     例:正数(int整型占四个字节(32bit)。一个字节等于八个比特位)
     原码——00000000000000000000000000001010(10)
     反码——00000000000000000000000000001010(10)
     补码——00000000000000000000000000001010(10)
    
     负数的原码,反码,补码要经过计算的
     反码是符号位不变,其他位按位取反,就是反码。补码是反码+1  
     例:负数
     原码——10000000000000000000000000001010(10)
     反码——11111111111111111111111111110101
     补码——11111111111111111111111111110110

1.左移操作符(<<)

左边舍弃,右边补0。 

下面是正数时

int main()
{
	int a = 10;//a为正数时
	//00000000000000000000000000001010(a的补码)
	int b = a << 1;
	//00000000000000000000000000010100(b的补码)
	printf("a=%d\n", a);//10
	printf("b=%d\n", b);//20=a*2^1
	return 0;
 }

 负数时:

int main()
{
	int a = -10;//a为负数时
	//10000000000000000000000000001010(a的原码)
	//11111111111111111111111111110101(a的反码)
	//11111111111111111111111111110110(a的补码)
	int b = a << 1;
	//11111111111111111111111111101100(a左边舍弃右边补0即为b的补码)
	//10000000000000000000000000010011
	//10000000000000000000000000010100(b的原码)
	printf("a=%d\n", a);//-10
	printf("b=%d\n", b);//-20=a*2^1
	return 0;
}

2.右移操作符(>>)

 1.算术右移[平常见到](右边舍弃,左边补原来的符号位)
 2.逻辑右移                (右边舍弃,左边直接补0)

正数时:

int main()
{
	int a = 10;
	//00000000000000000000000000001010
	int b = a >> 1;
	//00000000000000000000000000000101(算术右移)
	//00000000000000000000000000000101(逻辑右移)
	printf("a=%d\n", a);
	printf("b=%d\n", b);
	return 0;
}

负数时:

int main()
{
	int a = -1;
	//10000000000000000000000000000001(a的原码)
	//11111111111111111111111111111110(a的反码)
	//11111111111111111111111111111111(a的补码)
	int b = a >> 1;
	//11111111111111111111111111111111(b的补码)
	//10000000000000000000000000000000
	//10000000000000000000000000000001(b的原码)
	printf("a=%d\n", a);
	printf("b=%d\n", b);
	return 0;
}

位操作符

1.按位与(&)

 对应二进制位有0为0,两个同为1为1。

int main()
{
	int a = 10;
	//00000000000000000000000000001010
	int b = -5;
	//10000000000000000000000000000101
	//01111111111111111111111111111010
	//01111111111111111111111111111011
	int c = a & b;
	//00000000000000000000000000001010(a)
	//01111111111111111111111111111011(b)
	//00000000000000000000000000001010(c)
	printf("c=%d\n", c);
	return 0;
}

2.按位或(|)

 对应二进制位有1为1,两个同为0为0。

int main()
{
	int a = 10;
	//00000000000000000000000000001010
	int b = -5;
	//01111111111111111111111111111011
	int c = a | b;
	//00000000000000000000000000001010(a)
	//01111111111111111111111111111011(b)
	//01111111111111111111111111111011(c)
	printf("c=%d\n", c);
	return 0;
}

3.按位异或(^)

对应二进制位相同为0,相异为1 。

int main()
{
	int a = -5;
	//01111111111111111111111111111011
	int b = 10;
	//00000000000000000000000000001010
	int c = a ^ b;
	//01111111111111111111111111111011
	//00000000000000000000000000001010
	//01111111111111111111111111110001
	printf("c=%d\n", c);//-15
	return 0;
}

 赋值操作符

  • 简单赋值(=):将右侧操作数的值赋给左侧操作数。
  • 复合赋值:如+=、-=、*=、/=、%=、<<=、>>=、&=、|=、^=等,它们在赋值的同时执行相应的算术或位操作。 

 单目操作符 

  • 逻辑非(!):对操作数进行逻辑非操作,如果操作数为真(非零),则返回假(0);如果操作数为假(0),则返回真(1)。
  • 取地址(&):获取变量的地址。
  • 间接引用(*):通过指针访问其所指向的值。
  • 自增(++)自减(--):分别使操作数的值增加或减少1。它们有前置和后置两种形式,前置形式在操作数被使用之前执行增减操作,后置形式则在操作数被使用之后执行。
  • sizeof:计算操作数的类型长度(以字节为单位)。
  • ~:对一个数的二进制按位取反。
  • (类型):强制类型转换。

关系操作符

  • 相等(==):检查两个操作数是否相等。
  • 不等(!=):检查两个操作数是否不相等。
  • 大于(>)小于(<)大于等于(>=)小于等于(<=):分别用于比较两个操作数的大小关系。

逻辑操作符 

  • 逻辑与(&&):如果两个操作数都为真,则返回真;否则返回假。逻辑与具有短路特性,即如果第一个操作数为假,则不会评估第二个操作数。(见假即假)
  • 逻辑或(||):如果两个操作数中至少有一个为真,则返回真;否则返回假。逻辑或同样具有短路特性也就是第一个操作数为真,不会再计算后面的操作数。(见真即真)

条件操作符 

  • 条件(表达式1?表达式2:表达式3):也称为三目操作符,用于根据条件表达式的真假来选择两个表达式中的一个进行计算。

 逗号表达式

  • 逗号(,):用逗号隔开的多个表达式从左向右依次执行,整个表达式的结果是最后一个表达式的结果。

 下标引用、函数调用和结构成员

  • 下标引用([ ]):用于访问数组的元素。
  • 成员访问(. 和 ->).(点操作符)用于访问结构体或联合类型的成员,->(箭头操作符)用于访问指向结构体或联合类型的指针的成员。

表达式求值 

       表达式求值的顺序一部分是由操作符的优先级和结合性决定,有些表达式的操作数在求值的过程中可能需要转换为其他类型。

截断:在实际表示中(比如在内存中),二进制数的开头可能不会有前导零(除非是为了对齐或特定格式的要求)。

  • 隐式类型转换:C的整型算术运算总是至少以缺省整型类型的精度来进行的。 为了获得这个精度,表达式中的字符和短整型操作数在使用之前被转换为普通整型,这种转换称为整型提升

 

int main()
{
	char ch1 = 24;
	//00000000000000000000000000011000
	//00011000 (取出一个字节即八个bit)————————截断
	//00000000000000000000000000011000一个字节中首位为符号位,则八个bit外剩下的bit全部补符号位
	char ch2 = 100;
	//00000000000000000000000001100100
	//01100100
	//00000000000000000000000001100100
	char ch = ch1 + ch2;
	//00000000000000000000000000011000 ch1——————整型提升
	//00000000000000000000000001100100 ch2
	//然后就是一位一位相加                64+32+16+8+4=124
	//00000000000000000000000001111100 (内存中为补码)
	
		//11111111111111111111111110000011 (先取反后加一)
		//11111111111111111111111110000100  原码

		//00000000000000000000000001111011 (先减一后取反)
		//11111111111111111111111110000100  原码

	//同样取一个字节10000100
	//11111111111111111111111110000100 (补码)
	//11111111111111111111111110000011
	//00000000000000000000000001111100  ch原码————————124
	printf("%d\n", ch);
	return 0;
}

 下面例举有符号char类型的取值范围的由来。之所以八个bit位因为char的字节为一(一个字节等于八个bit位),相同如果需要计算short的取值范围则需要16个bit位(两个字节),int则需要32个bit位(四个字节)等等。无符号的更简单一些,首位不是符号位而是有效位。

  • 算术转换 :如果某个操作符的各个操作数属于不同的类型,那么除非其中一个操作数的转换为另一个操作数的类 型,否则操作就无法进行。下面的层次体系称为寻常算术转换。

 

  • 操作符的属性 :复杂表达式的求值有三个影响的因素。 1. 操作符的优先级 2. 操作符的结合性 3. 是否控制求值顺序。(相邻两个操作符才有优先级)

写表达式时尽量不要写的模棱两可(即问题代码),能简单写简单写。 

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

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

相关文章

【Web开发手礼】探索Web开发的秘密(十四)-Vue2(1)Node.js的安装、Vue入门

主要介绍了Node.js的安装教程、Vue2常用的一些指令、声明周期&#xff01;&#xff01;&#xff01; 文章目录 前言 Node.js安装 选择安装目录 验证NodeJS环境变量 配置npm的全局安装路径 切换npm的淘宝镜像 安装Vue-cli ​编辑 Vue2入门 引入vue.js文件 入门代码 常用指令 生…

眼在手外-机器人坐标系与相机坐标系标定方法

1 眼在手外坐标系概述 实现机械臂和相机的手眼标定&#xff0c;就是要通过双目相机坐标系、机械臂坐标系和机械臂 末端执行器三者的坐标系转换&#xff0c;求出手眼转换矩阵。设双目相机坐标系为 Oc&#xff0c;标定板坐标 系为 Ow&#xff0c;末端执行器坐标系为 Oe&#xff0…

【学习笔记】Day 3

一、进度概述 1、作业1 2、组会会议纪要——没太听懂&#xff0c;得再看 二、详情 1、作业1 &#xff08;1&#xff09;在python中&#xff0c;想要使output为图片&#xff0c;需要用的matplotlib库&#xff0c;这里做简单的整理&#xff0c;以便更好的理解代码。 …

ADC的介绍和工作原理

一&#xff0c;什么是ADC&#xff1f; Analog-to-Digital Converter&#xff0c;指模拟/数字转换器 什么是ADC&#xff1a; ADC可以将引脚上连续变化的模拟电压转换为内存中存储的数字变量&#xff0c;建立模拟电路到数字电路的桥梁 SUCH AS: 12 位 ADC 是一种逐次逼近…

免费【2024】springboot 导师选择管理系统的管理设计与实现

博主介绍&#xff1a;✌CSDN新星计划导师、Java领域优质创作者、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行前辈交流✌ 技术范围&#xff1a;SpringBoot、Vue、SSM、HTML、Jsp、PHP、Nodejs、Python、爬虫、数据可视化…

从零入门 AI for Science(AI+药物) 笔记 #Datawhale AI 夏令营

&#x1f496;使用平台 我的Notebook 魔搭社区 https://modelscope.cn/my/mynotebook/preset . 魔搭高峰期打不开Task3又换回飞桨了 吧torch 架构换成了 飞桨的paddle 飞桨AI Studio星河社区-人工智能学习与实训社区 https://aistudio.baidu.com/projectdetail/8191835?cont…

解决电脑数字小键盘经常自动关闭的问题

本文解决了电脑数字小键盘经常自动关闭的问题&#xff0c;可供大家参考。 winR&#xff0c;输入regedit打开注册表 依次选择HKEY_USERS DEFAULT Control Panel---Keyboard”&#xff0c;将InitialKeyboardIndicators的值由2147483648改为80000002&#xff0c;即可解决。

xss漏洞(四,xss常见类型)

本文仅作为学习参考使用&#xff0c;本文作者对任何使用本文进行渗透攻击破坏不负任何责任。 前言&#xff1a; 1&#xff0c;本文基于dvwa靶场以及PHP study进行操作&#xff0c;靶场具体搭建参考上一篇&#xff1a; xss漏洞&#xff08;二&#xff0c;xss靶场搭建以及简单…

[240804] OpenTofu 1.8.0 发布,带来更友好的编码体验 | 生成式 AI 滥用现象分析

目录 OpenTofu 1.8.0 发布&#xff0c;带来更友好的编码体验生成式 AI 滥用现象分析 OpenTofu 1.8.0 发布&#xff0c;带来更友好的编码体验 OpenTofu 1.8.0 现已发布&#xff0c;主要功能包括&#xff1a; 变量和局部值的早期求值: 现在可以在模块源、后端配置和状态加密等更…

西部数据HDD和闪存业务均在复苏加速

财务概览 西部数据&#xff08;Western Digital&#xff09;截至2024年7月341日的第四财季营收达到37.6亿美元&#xff0c;同比增长41%&#xff0c;超出预期的33亿美元&#xff0c;净利润达到3.3亿美元&#xff0c;与去年同期亏损7.15亿美元形成鲜明对比。整个2024财年的营收增…

C语言初阶(12)

1.调试的基本 调试是发现并解决C语言编译的bug的方法。 调试基本步骤是1.发现程序错误的存在 2.以隔离、消除等方式对错误进行定位 3.确定错误产生的原因 4.提出纠正错误的解决办法 5.对程序错误予以改正&#xff0c;重新测试 编译版本release和debug版本&#xff0c;releas…

一例AutoHotkey语言生成的文件夹病毒分析

概述 这是一个使用AutoHotkey语言编写的文件夹病毒&#xff0c;使用ftp服务器来当作C2&#xff0c;通过U盘传播&#xff0c;样本很古老&#xff0c;原理也很简单&#xff0c;这种语言的样本还是第一次见到&#xff0c;记录一下。 样本的基本信息 PE32库: AutoIt(3.XX)[-]编译…

Cocos Creator2D游戏开发(11)-飞机大战(9)-cocos发布微信小游戏

准备工作: ① cocosCreator ②微信小游戏开发者工具 第一步: cocosCreator 打包编译,设置发布平台,默认场景,设备方向,AppId 最后点击构建 等待构建完成 第二步: 导入微信开发者工具 就是cocos Creator 中构建发布里面的发布路径 然后编译: 剩下的就是微信开发者工具…

Bootstrap框架介绍

1、Bootstrap框架的下载和使用 Bootstrap框架是基于HTML、CSS、JavaScript的CCS/HTML框架,是一种封装好的前端框架。它包括js、css、front字体样式库。该框架下载链接:https://v3.bootcss.com/getting-started/#download,并选择下载源码。 建一个BootstrapDemo文件夹,将js…

反激式电源为什么上电最容易烧MOS管?

大家好,这里是大话硬件。 这篇文章总结一下最近在研究的反激电源RCD吸收回路和VDS尖峰问题。这也是为什么MOS管在开机容易被电压应力击穿的原因。 下图是反激电源变压器部分的拓扑。 在MOS开通时,VDS上电压: 由于Rdson比较小,MOS开通时,VDS电压也较小。此时,MOS漏极电…

对象存储及其相关概念介绍

对象存储是一种用来描述解决和处理离散单元&#xff08;这些离散单元被称作为对象&#xff09;的方法的通用术语。以下是关于对象存储的详细解析&#xff1a; 一、基本概念 定义&#xff1a;对象存储&#xff0c;也叫做基于对象的存储&#xff0c;是一种将数据以对象的形式进…

【过题记录】8.4(robocom补题,网络流)

今天robocom国赛&#xff0c;因为一个bool函数忘记return 1而裂开(错失21分) 以此为戒 贪心消消乐 其实就是一个求最大子矩阵和的板子题 利用最大子段和的思想 枚举矩阵中的上下界 压成一维后利用最大子段和 O ( n ) O(n) O(n)处理 复杂度 O ( n 3 ∗ k ) O(n^3*k) O(n3∗k) k为…

VSCode开发Go的精准定位

下载Golang安装包 Download and install - The Go Programming Languagehttps://golang.google.cn/doc/install 安装完成后,配置go env go env -w GO111MODULE=on go env -w GOPROXY="https://goproxy.io,direct"

Maven介绍安装【后端 1】

Maven 入门与安装指南 引言 在Java开发领域&#xff0c;Maven作为一款强大的项目管理和构建工具&#xff0c;广受开发者喜爱。它不仅能够帮助我们管理项目依赖&#xff0c;还能统一项目结构&#xff0c;提供跨平台的自动化构建方式。本文将详细介绍Maven的基本概念、安装步骤以…

Face2V人脸向量开发包

Face2V SDK适用于需要人脸检测、人脸特征点和特征向量提取的应用&#xff0c;提供Web API和原生API。官方下载地址&#xff1a;Face2V SDK 。 1、目录组织 Face2V SDK开发包的目录组织说明如下&#xff1a; face2v_sdk | - core # 核心代码目录| -…