C语言操作符详解(上)

news2024/11/26 20:22:30

C语言操作符详解(上)

  • 前言
  • 1. 算术操作符
  • 2. 移位操作符
    • 2.1 左移操作符(<<)
    • 2.2 右移操作符(>>
  • 3. 位操作符
    • 3.1 按位与(&
    • 3.2 按位或(|
    • 3.4 按位异或(^
    • 3.5 一道变态的面试题
  • 4. 关系操作符
  • 5. 单目操作符
    • 单目操作符介绍:
    • 5.1 单目操作符(!
    • 5.2 单目操作符(~
    • 5.3 单目操作符(&、*
    • 5.4 单目操作符(++、--
    • 5.5 单目操作符(sizeof)和数组
  • 6. 结尾

前言

在C语言中,C标准提供了丰富的操作符,被用来对数据进行操作和计算,常用数学计算、比较、逻辑运算等操作。操作符是编程语言中非常重要的一部分,它们可以使程序更加简洁、高效,同时也可以增强代码的可读性和可维护性。本文将详细系统介绍C语言操作符,希望能帮读者全面理解C语言操作符!

1. 算术操作符

算术操作符分为以下5种,虽然简单,但还是有一些细节需要注意。

+)、(-)、(*)、(/)、(%

  • 除了%(取余)操作符之外,其他几个操作符可以作用于整数和浮点数。
  • 对于/操作符,如果两个操作数都为整数,执行整数除法。而只要有一个浮点数就执行浮点数除法。
  • %操作符的两个操作数必须为整数。返回的是整除之后的余数。

2. 移位操作符

在C语言中,移位操作符分为以下两种

  • <<左移操作符
  • >>右移操作符

相关知识补充:

#include <stdio.h>
int main()
{
	int a = 15;
	//00000000000000000000000000001111 - 原码
	//00000000000000000000000000001111 - 反码
	//00000000000000000000000000001111 - 补码

	int b = -15;
	//10000000000000000000000000001111 - 原码
	//11111111111111111111111111110000 - 反码
	//11111111111111111111111111110001 - 补码
	return 0;
}

Tips:

  • 位移操作符的操作数只能是整数。
  • 计算机能处理的是二进制的信息。而整数的二进制表示形式分为三种:原码、反码、补码。
  • 正整数的原码、反码、补码是相同的。负整数的反码是原码符号位不变,其他未按位取反、反码在加1就得到补码。

2.1 左移操作符(<<)

移位规则:

左边抛弃、右边补0

例子:

#include <stdio.h>
int main()
{
	int a = 15;
	//00000000000000000000000000001111 - (a)补码

	int b = a << 1;
	//对a的补码右移一位得到b的补码,左边抛弃,右边补0
	//00000000000000000000000000011110 - (b)补码
	//00000000000000000000000000011110 - (b)反码
	//00000000000000000000000000011110 - (b)原码
	
	printf("b=%d\n", b); //b得值为:30
	return 0;
}

2.2 右移操作符(>>

移位规则:

C语言中,右移运算分为两种:

  1. 逻辑右移:左边用0填充,右边丢弃。
    2. 算术右移:左边用原该值的符号位填充,右边丢弃。

上述两种运算方式,C语言没有明确规定到底是算术右移还是逻辑右移。但一般编译器上采用的是算术右移。
例子:

int main()
{
	int a = -15;
	//10000000000000000000000000001111 - 原码
	//11111111111111111111111111110000 - 反码
	//11111111111111111111111111110001 - 补码

	int b = a >> 1;
	//左边用原该值的符号位填充,右边丢弃
	//11111111111111111111111111111000 - 补码
	//11111111111111111111111111110111 - 反码
	//10000000000000000000000000001000 - 原码
	
	printf("b=%d\n", b); //b的值为:-8
	return 0;
}

警告:
对于移位运算符,不要移动负位数,这个行为C标准未定义的。

int num=10;
num>>-1; //error

3. 位操作符

在C语言中,位操作符有以下三种:&(按位与)、|(按位或)、^(按位异或)。
Tips:位操作符的操作数必须是整数,同时也是操作二进制位的。

3.1 按位与(&

& — 补码对应的二进制位有0则为0,两个同时为1才是1.

例子:

int main()
{
	int a = 3;
	//00000000000000000000000000000011 - 补码
	int b = -5;
	//10000000000000000000000000000101 - 原码
	//11111111111111111111111111111010 - 反码
	//11111111111111111111111111111011 - 补码

	int c = a & b;
	//&补码对应的二进制位有0则为0,两个同时为1才是1.
	//00000000000000000000000000000011 - 补码(a)
	//11111111111111111111111111111011 - 补码(b)
	//00000000000000000000000000000011 - 补码(c)

	printf("c=%d\n", c); //c的值为:3
	return 0;
}

3.2 按位或(|

| — 补码对应的二进制位有1则为1,两个同时为0才是0.

例子:

int main()
{
	int a = 3;
	//00000000000000000000000000000011 - 补码
	int b = -5;
	//10000000000000000000000000000101 - 原码
	//11111111111111111111111111111010 - 反码
	//11111111111111111111111111111011 - 补码

	int c = a | b;
	//&补码对应的二进制位有1则w为1,两个同时为0才是0.
	//00000000000000000000000000000011 - 补码(a)
	//11111111111111111111111111111011 - 补码(b)
	//11111111111111111111111111111011 - 补码(c)

	//11111111111111111111111111111010 - 反码(c)
	//10000000000000000000000000000101 - 原码(c)

	printf("c=%d\n", c);//c的值为:-5
	return 0;
}

3.4 按位异或(^

|^— 补码对应的二进制位不相同则为1,两个相同则为0.

int main()
{
	int a = 3;
	//00000000000000000000000000000011 - 补码
	int b = -5;
	//10000000000000000000000000000101 - 原码
	//11111111111111111111111111111010 - 反码
	//11111111111111111111111111111011 - 补码

	int c = a ^ b;
	//^ 补码对应的二进制位不相同则为1,两个同时为1或0时才是0.

	//00000000000000000000000000000011 - 补码(a)
	//11111111111111111111111111111011 - 补码(b)
	//11111111111111111111111111111000 - 补码(c)

	//11111111111111111111111111110111 - 反码(c)
	//10000000000000000000000000001000 - 原码(c)

	printf("c=%d\n", c);//c的值为:-8
	return 0;
}

3.5 一道变态的面试题

不能创建临时变量(第三个变量),实现两个数的交换。

int main()
{
	int a = 10;
	int b = 20;
	//交换,按位异或是支持交换律的
	a = a ^ b;
	b = a ^ b;
	a = a ^ b;
	printf("a=%d b=%d\n", a, b);
	return 0;
}
  • 按位异或是支持交换律的。

4. 关系操作符

在这里插入图片描述
这些关系运算符比较简单,没什么可介绍的。

5. 单目操作符

单目操作符介绍:

在这里插入图片描述

5.1 单目操作符(!

(!)逻辑反操作,顾名思义就是把真变成假,把假变成真。

int main()
{
	int flag = 0;//下面两种判断flag为0就执行语句的方法,效果一样
	//方法1:
	if (flag == 0)
	{
		//语句;
	}

	//方法2:flag为0,则为假。!a则为真,执行语句
	if (!flag)
	{
		//语句;
	}
	return 0;
}

5.2 单目操作符(~

单目操作符(~)是按补码二进制位全部取反.(包括符号位)

例子:

int main()
{
	int a = 0;
	//00000000000000000000000000000000 - 补码

	int b = ~a;
	//~a--对a的补码全部取反
	//11111111111111111111111111111111 - 补码
	//11111111111111111111111111111110 - 补码
	//10000000000000000000000000000001 - 原码

	printf("%d\n", b); //b的值位:-1
	return 0;
}

5.3 单目操作符(&、*

单目操作符(&、*)都运用于指针。

int main()
{
	int a = 0;
	//pa是指针变量
	int* pa = &a; //&—取地址操作符—取出a的地址
	
	//解引用操作符(间接访问操作符)—通过pa中存放的地址,找到指向的空间(内容)
	*pa = 20;
	return 0;
}

5.4 单目操作符(++、–

单目单目操作符++- -),分为前置++- -)和后置++
前置++): 先++(- -),在使用。
后置++): 先使用,在++(- -)。

例子1:

int main()
{

	int a = 2;
	int b = --a; //前置--,先--,在使用
	//a=a-1,b=a
	printf("a=%d b=%d\n", a, b);//a,b的值都为:1	
	return 0;
}

例子2:

int main()
{
	int a = 2;
	int b = a--; //后置--,先使用,在--
	//b=a,a=a-1
	printf("a=%d b=%d\n", a, b);//a的值为1,b的值为2
	return 0;
}

前置++和后置++同理。

5.5 单目操作符(sizeof)和数组

单目操作符(sizrof)用于计算操作数的类型长度。(单位字节)

#include <stdio.h>
void test1(int arr[])
{
	printf("%d\n", sizeof(arr));
}

void test2(char ch[])
{
	printf("%d\n", sizeof(ch));
}
int main()
{
	int arr[10] = { 0 };
	char ch[10] = { 0 };
	printf("%d\n", sizeof(arr));//10X4
	printf("%d\n", sizeof(ch)); //10X1
	test1(arr);
	test2(ch);
	return 0;
}

运行结果(x64环境下):
在这里插入图片描述
上述前两个结果毋庸置疑,但为什么后两个都是8byte呢?
上面调用函数test1()和test2(),传过去的是指针。C语言中,在64位机器上(x64),指针大小为8byte;在32位机器上(x86)上,指针大小为4byte.

6. 结尾

本篇文章到此就结束了!创作不易,如果对你有帮助,记得点赞加关注哦!感谢您的支持,同时也欢迎读者发表自己的见解!

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

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

相关文章

(4)定时器

51单片机的定时器属于单片机的内部资源&#xff0c;其电路的连接和运转均在单片机内部完成 作用&#xff1a; 用于计时系统替代长时间Delay&#xff0c;提高运行效率和速度任务切换 STC89C52定时器资源&#xff1a; 定时器个数&#xff1a;3个&#xff08;T0,T1,T2&#xf…

【MySQL】MySQL 运算符

目录 一、运算符简述 二、运算符使用 1.算术运算符 1.1 加法运算符 1.2 减法运算符 1.3 乘法与除法运算符 1.4 求模&#xff08;求余&#xff09;运算符 2.比较运算符 2.1 等号运算符 2.2 安全等于运算符 2.3 不等于运算符 2.4 空运算符 2.5 非空运算符 2.6 最小…

深度剖析Mybatis-plus Injector SQL注入器

背景 在项目中需要同时操作Sql Server 以及 MySQL 数据库&#xff0c;可能平时直接使用 BaseMapper中提供的方法习惯 了&#xff0c;不用的话总感觉影响开发效率&#xff0c;但是两个数据库的SQL语法稍微有点差别&#xff0c;有些暴露的方法并不能直接使用&#xff0c;所以便想…

WebSocket的那些事(3-STOMP实操篇)

目录 一、序言二、STOMP详解1、STOMP简单介绍2、STOMP协议内容3、使用STOMP的好处 三、代码示例1、Maven依赖2、开启WebSocket消息代理3、控制器4、前端页面greeting.html 四、测试1、连接服务端2、发送消息 五、STOMP消息传播流程六、结语 一、序言 上节中我们在 WebSocket的…

(11)LCD1602液晶显示屏

LCD1602&#xff08;Liquid Crystal Display&#xff09;液晶显示屏是一种字符型液晶显示模块&#xff0c;可以显示ASCII码的标准字符和其它的一些内置特殊字符&#xff0c;还可以有8个自定义字符&#xff0c;自带芯片扫描 显示容量&#xff1a;162个字符&#xff0c;每个字符…

【C++】STL六大组件简介

STL(standard template libaray-标准模板库)&#xff1a;是C标准库的重要组成部分&#xff0c;不仅是一个可复用的组件库&#xff0c;而且是一个包罗数据结构与算法的软件框架。 1.STL的版本介绍 原始版本 Alexander Stepanov、Meng Lee 在惠普实验室完成的原始版本&#xff…

Unity里面CG和HLSL在写法上的一些区别

大家好&#xff0c;我是阿赵。这里继续讲URP相关的内容。 这次想讲的是CG和HLSL在写法上的一些区别。 一、为什么开始用HLSL 首先&#xff0c;基本上大家都知道的事情再说一遍。 三种Shader编程语言&#xff1a; 1、基于OpenGL的OpenGL Shading Language&#xff0c;缩写GLSL…

接口测试中postman环境和用例集

postman的环境使用 postman里有环境的设置&#xff0c;就是我们常说的用变量代替一个固定的值&#xff0c;这样做的好处是可以切换不同的域名、不同的环境变量&#xff0c;不同的线上线下账户等等场景。下面就看下怎么用吧。 创建一个Environment postman有一个envrionment&am…

Java是如何实现双亲委托机制的

Java 是一种面向对象的编程语言&#xff0c;它有一套独特的类加载机制。其中&#xff0c;双亲委托加载机制是 Java 类加载机制中的一个重要概念。本文将介绍 Java 的双亲委托加载机制是如何实现的&#xff0c;并解释其作用和优点。 Java 类加载机制 在 Java 中&#xff0c;类的…

瀑布流组件陷入商品重复怪圈?我是如何用心一解的!

目录 背景 瀑布流组件 什么是瀑布流组件 如何实现一个瀑布流组件 商品重复的原因 解决方案 方法一&#xff08;复杂&#xff0c;不推荐&#xff09;&#xff1a;标记位大法 方法二&#xff08;优雅&#xff0c;推荐&#xff09;&#xff1a;Promise 队列 大法 总结 背…

解决新思路#报错:ping: www.baidu.com: 未知的名称或服务--照着步骤来还是ping不通的可能原因

最近由ubantu转为centos7,配置hadoop&#xff0c;配置静态ip的过程中一直ping不通。之前配置ubantu的也是&#xff0c;终于这次在重启虚拟机和主机后发现了原因。 中途尝试过: 1.三次以上命令行反复操作 2.图形界面设置 3.看是否主机的网络适配器的网关与设置的IP地址产生冲突…

JavaScript实现计算100之间能被5整除的数的代码

以下为实现计算100之间能被5整除的数的程序代码和运行截图 目录 前言 一、计算100之间能被5整除的数 1.1 运行流程及思想 1.2 代码段 1.3 JavaScript语句代码 1.4 运行截图 前言 1.若有选择&#xff0c;您可以在目录里进行快速查找&#xff1b; 2.本博文代码可以根据题…

2023最新100道渗透测试面试题(附答案)

眨眼间2023年快过去一半了&#xff0c;不知道大家有没有找到心仪的工作呀&#xff0c;今天我给大家整理了100道渗透测试面试题给大家&#xff0c;需要答案的话可以在评论区给我留言哦~ 第一套渗透面试题 什么是渗透测试&#xff1f;它的目的是什么&#xff1f; 渗透测试的五个…

DirectX12 简单入门(一)

在很久以前写过关于DirectX9的一些应用&#xff0c;直到现在DirectX12已经普及了。写完几个DirectX12测试代码之后&#xff0c;写一篇DirectX12简单入门介绍一下基本概念&#xff0c;以及环境搭建和编程过程。 编程环境 与DirectX9不同&#xff0c;在DirectX12开发中微软将需…

『MySQL 实战 45 讲』“order by” 是怎么工作的

“order by” 是怎么工作的 首先创建一个表 CREATE TABLE t ( id int(11) NOT NULL, city varchar(16) NOT NULL, name varchar(16) NOT NULL, age int(11) NOT NULL, addr varchar(128) DEFAULT NULL, PRIMARY KEY (id), KEY city (city) ) ENGINEInnoDB;全字段排序 在 cit…

自己搭建go web 框架

思想base部分day1:封装gee封装context上下文封装tree路由树分组封装group与中间件封装文件解析封装封装错误处理 思想 web框架服务主要围绕着请求与响应来展开的 搭建一个web框架的核心思想 1 便捷添加响应路径与响应函数(base) 2 能够接收多种数据类型传入(上下文context) 3 构…

【Linux】Linux入门学习之常用命令五

介绍 这里是小编成长之路的历程&#xff0c;也是小编的学习之路。希望和各位大佬们一起成长&#xff01; 以下为小编最喜欢的两句话&#xff1a; 要有最朴素的生活和最遥远的梦想&#xff0c;即使明天天寒地冻&#xff0c;山高水远&#xff0c;路远马亡。 一个人为什么要努力&a…

支付系统设计五:对账系统设计01-总览

文章目录 前言一、对账系统构建二、执行流程三、获取支付渠道数据1.接口形式1.1 后台配置1.2 脚本编写1.2.1 模板1.2.2 解析脚本 2.FTP形式2.1 后台配置2.2 脚本编写2.2.1 模板2.2.2 解析脚本 四、获取支付平台数据五、数据比对1. 比对模型2. 比对器 总结 前言 从《支付系统设…

AE基础教程

一&#xff1a;粒子插件。 AEPR插件-Trapcode Suite V18.1.0 中文版 二&#xff1a;跟随手指特效。 1&#xff1a;空对象位置关键帧跟随手指。 2&#xff1a;发射粒子位置&#xff0c;按住Alt键&#xff0c;连接到空对象位置处。。 三&#xff1a;CtrI导入素材快捷键。 四&a…

Elasticsearch基础学习-常用查询和基本的JavaAPI操作ES

关于ES数据库的和核心倒排索引的介绍 一、Elasticsearch概述简介关于全文检索引擎关系型数据库的全文检索功能缺点全文检索的应用场景Elasticsearch 应用案例 二、Elasticsearch学习准备安装下载关于es检索的核心-倒排索引正向索引&#xff08;forward index&#xff09;倒排索…