【C语言初阶(15)】操作符1

news2024/11/25 15:31:32

文章目录

  • Ⅰ操作符的分类
  • Ⅱ 算术操作符
  • Ⅲ 移位操作符
    • ⒈左移操作符
    • ⒉右移操作符
  • Ⅳ 位操作符
    • ⒈按位取
    • ⒉按位与
    • ⒊按位异或
    • ⒋按位或
    • ⒌位操作符练习题
  • Ⅴ赋值操作符
  • Ⅵ 单目操作符

Ⅰ操作符的分类

  • 算术操作符
  • 移位操作符
  • 位操作符
  • 赋值操作符
  • 单目操作符
  • 关系操作符
  • 逻辑操作符
  • 条件操作符
  • 逗号表达式
  • 下标引用、函数调用和结构成员

Ⅱ 算术操作符

操作符名称例子结果
+加法运算符(双目)5 + 38
-减法运算符(双目)5 - 32
*乘法运算符(双目)5 * 315
/除法运算符(双目)5 / 3,5.0 / 3.01,1.666667
%求余运算符(双目)5 % 3,5.0 % 3.02,出错
+正号运算符(单目)+55
-负号运算符(单目)-5-5

这里有以下几点需要注意

  1. 对于整数间的除法采取直接舍弃小数部分的方式,而不是四舍五入.
  2. 对于浮点数间的除法则能获得一个相对逼近结果的值(如果除不尽或位数特别多的话)。
  3. 百分号(%)表示求余数的意思,但求余运算符要求两边的操作数都必须是整数,其结果也是整数

Ⅲ 移位操作符

  • C 语言中提供了可以将某个变量中所有的二进制位进行左移或右移的操作符:移位操作符
  • 将变量存储在内存中的二进制补码进行移动,左移一位为乘 2,右移一位为除 2。
操作符名称例子结果
<<左移操作符6 << 112
>>右移操作符6 >> 13
<< 左移操作符
>> 右移操作符

关于移位操作符的注意事项

  1. 移位操作符的操作数只能是整数
  2. 整数在移位中,移动的是整数存储在内存中的二进制补码
  3. 反码移动完了之后,如果想打印结果,打印出的结果是反码转成的原码。
  4. 移位操作并不会改变变量的值,如 a >> 1,并不会改变 a 的值,想改变 a 的值必须要 a = a >> 1 这么写。

⒈左移操作符

<< 左移操作符
  • 左移操作符(<<)拥有两个操作数,但两者的意义是不一样的;
  • 左边的操作数是即将被移位的数据,右边的操作数指定移动的位数。
  • 移位规则:将左边移出的位数全部抛弃,右边用 0 填充空位。

举个栗子

  • 注:一个整型应该有 32 个二进制位,但是这里为了方便画图就只使用 8 个比特位。
  • 将一个二进制数 1100 1010 左移 2 位,就这样写:
11001010 << 2
  • 结果就是 0010 1000,如下图所示。

在这里插入图片描述

  • 这里演示的是负数的移位,想打印出来必须先将移位后的结果转换成原码才行。

⒉右移操作符

>> 右移操作符
  • 右移操作符(>>)同样拥有两个操作数;
  • 左边的操作数是即将被移位的数据,右边的操作数指定移动的位数。

右移操作符分为两种

  1. 逻辑移位:右边丢弃,左边补 0。
  2. 算术移位:右边丢弃,左边补原符号位。

1. 逻辑移位

  • 右边丢弃,左边补 0
  • 一个二进制数 1100 1010 右移 2 位,就这样写:
11001010 >> 2
  • 结果就是 00111010,如下图所示。

在这里插入图片描述

  • 绝大部分机器都不用逻辑移位,因为就像这种,我给的是个负数,逻辑移位之后直接一下就变成正数了。

2. 算术移位

  • 右边丢弃,左边补原符号位。
  • 负数算术移位:将一个二进制数 1100 1010 右移 2 位,就这样写:
11001010 >> 2
  • 结果就是 1111 1010,如下图所示。

在这里插入图片描述

  • 正数算术移位:将一个二进制数 0011 0101 右移两位,就这样写:
00110101 >> 2

结果就是 0000 1101,如下图所示。

在这里插入图片描述

  • 绝大部分机器用得都是算术移位,能够保证原来的数不管是正数还是负数,在移位之后都不会改变正负。

Ⅳ 位操作符

  • 对整型的每一个二进制位进行操作。
操作符含义优先级举例说明
~按(二进制)位取反~aa 的二进制位上,所有的 0 变成 1,1 变成 0
&按(二进制)位与a & b只有 a 和 b 对应的二进制位上的值都为 1,结果才为 1;有 一个为 0,结果都是 0
^按(二进制)位异或a ^ ba 和 b 的对应二进制位上,相同为 0,相异为 1
|按(二进制)位或最低a | ba 和 b 的对应二进制位上,只要有一个为 1,结果为 1;只有 a 和 b 同时为 0,结果才为 0

⒈按位取

  • 作用是将一个整数的二进制补码上的 1 变成 0, 0 变成 1。

在这里插入图片描述

举个栗子

  • 将 -1 的补码按位取反,然后将结果打印出来
#include <stdio.h>

int main()
{
	int a = -1;

	// 10000000 00000000 00000000 00000001 :-1 的原码
	// 11111111 11111111 11111111 11111110 :-1 的反码
	// 11111111 11111111 11111111 11111111 :-1 的补码

	// 00000000 00000000 00000000 00000000 :~a 的补码
	// 00000000 00000000 00000000 00000000 :~a 的反码
	// 00000000 00000000 00000000 00000000 :~a 的原码

	printf("~a = %d\n", ~a);//打印的是~a的原码

	return 0;

在这里插入图片描述

⒉按位与

  • 对两个整数的二进制位补码进行按位与。
  • 两个数的对应二进制位补码上,全 1 则 1

在这里插入图片描述

举个栗子

  • 将 3 的补码和 -5 的补码进行按位与( & )。
#include <stdio.h>

int main()
{
	int a = 3;
	int b = -5;
	int c = a & b;

	//  00000000 00000000 00000000 00000011 : 3 的补码
	//& 11111111 11111111 11111111 11111011 :-5 的补码
	//结果为 3
	//  00000000 00000000 00000000 00000011 : 全 1 则 1

	printf("%d\n", c);//将按位与后的补码结果转换成原码再进行打印

	return 0;
}

在这里插入图片描述

⒊按位异或

  • 只有当两个操作数对应的二进制(补码)位不同时,它的结果才为 1,否则为 0。
  • 相同为 0,相异 为 1

在这里插入图片描述

举个栗子

  • 不能创建临时变量,交换两个变量的值。
#include <stdio.h>

int main()
{
	int a = 3;
	int b = 5;
	printf("交换前:a = %d,b = %d\n", a, b);

	a = a ^ b; // a = 3 ^ 5
	b = a ^ b; // b = 3 ^ 5 ^ 5 --> b = 3
	a = a ^ b; // a = 3 ^ 5 ^ 3 --> a = 5

	printf("交换后:a = %d,b = %d\n", a, b);

	return 0;
}

在这里插入图片描述

⒋按位或

  • 对两个整数的对应二进制位补码进行按位或。
  • 两个数的对应二进制位补码上,全 0 则 0

在这里插入图片描述

举个栗子

  • 将 3 的补码和 -5 的补码进行按位或( | )。
#include <stdio.h>

int main()
{
	int a = 3;
	int b = -5;
	int c = a | b;

	//  00000000 00000000 00000000 00000011 : 3 的补码
	//| 11111111 11111111 11111111 11111011 :-5 的补码
	
	//  11111111 11111111 11111111 11111011 : 全 0 则 0
	//  %d 是将上述结果转换成原码再进行打印
	//  11111111 11111111 11111111 11111010 :反码
	//  10000000 00000000 00000000 00000101 :原码为-5

	printf("%d | %d = %d\n", a, b, c);

	return 0;
}

在这里插入图片描述

⒌位操作符练习题

题目内容

  • 编写代码实现:求一个整数存储在内存中的二进制中1的个数。

解题思路

  • 定义一个变量 a 来存储输入的整数。
  • 用变量 a & 1,这样就能获取到二进制位上最后一位的数字。
  • 将 a & 1 的值赋给 n ,如果最后一位是1(n=1),则让计数器 +1;
  • 获得了最后一位的数字之后,利用右移操作符将 a 的二进制位右移操 1 位,直到总共移了 32 位为止。
  • 最后直接打印计数器的值即可。

代码实现

#include <stdio.h>

int main()
{
	int a = 0;
	int n = 0;
	int count = 0;
	int move = 32;

	printf("请输入要统计的数:");
	scanf("%d", &a);
	int b = a;

	while (move)
	{
		n = a & 1;
		if (1 == n)
		{
			count++;
		}
		a = a >> 1;//将得到的最后一位去掉,移位了之后还必须将移位后的值赋给a
		//不要像我一样想了半天
		move--;//只能移动 32 位
	}
	printf("%d 二进制数中有 %d 个 1\n", b, count);

	return 0;
}

结果演示

在这里插入图片描述

Ⅴ赋值操作符

  • 前面讲过的那些操作符还可以和赋值号结合起来,使得代码更加简洁。
  • 譬如说,a += b 等价于 a = a + b,其余复合赋值符同义。

复合赋值符

  • +=、-=、*=、/=、%=。
  • >>=、<<=。
  • &=、|=、^=。

Ⅵ 单目操作符

  • 只有一个操作数的操作符称为单目操作符
操作符名称
!逻辑反操作
-负值
+正值
&取地址
sizeof操作数的类型长度(以字节为单位)
~对一个数的二进制按位取反
前置、后置–
++前置、后置++
*间接访问操作符(解引用操作符)
(类型)强制类型转换

1. “ ! ” 逻辑反

  • 真变假,假变真(0 表示假,非 0 表示真)。
  • 举例 !a:如果 a 为真,则 !a 为假;如果 a 为假,则 !a 为真。

2. “ & ” 取地址

  • 取出一个变量在内存中的地址。
  • 例如:取出变量 a 的地址,并打印出来。

在这里插入图片描述

  • &a 取出的是 a 占的四个字节中得第一个字节的地址。

3. “ sizeof ” 求操作数的类型大小

  • sizeof 是一个操作符,计算的是 变量/类型 所占内存空间的大小,单位是字节。

在这里插入图片描述

  • sizeof (数组名) 计算的是整个数组的大小。

在这里插入图片描述

4. “ ++ ” 自增操作符

  • 前置++:先让变量的值+1,再使用+1之后的变量的值。
  • 后置++:先使用变量的值,再让变量的值+1。

自增操作符在单独使用的时候前置后置都没什么区别,如 a++,++a 意思都是 a = a + 1。

但是将 ++a 和 a++ 赋值给另一个变量的时候,两者的差异就产生了。

#include <stdio.h>

int main()
{
	int a = 5;
	int b = 0;
	b = ++a;//先对自身进行++运算,再将变量a的值赋给b(此时变量a的值已经+1了)
	printf("a = %d,b = %d\n", a, b);

	a = 5;
	b = a++;//先将变量a中保存的值赋给b,再对自身进行++运算
	printf("a = %d,b = %d\n", a, b);

	return 0;
}

5. “ - - ”自减操作符

  • ++ 能够理解的话,-- 也是一回事。

在这里插入图片描述

6. “ * ” 间接访问操作符(解引用操作符)

  • 当需要访问指针变量指向的数据时,可以使用解引用操作符 “ * ”。
  • 解引用操作符跟定义指针变量一样都是使用星号 “ * ”,这属于符号的重用,即在不同的地方有不同的意义:
    • 在定义时表示定义一个指针变量,在其他位置表示获取指针变量指向的变量的值。
  • 直接访问:直接通过变量名来访问变量的值,称为直接访问;
  • 间接访问:通过指针变量这样的形式来访问变量的值,称为间接访问。
#include <stdio.h>

int main()
{
	int  a = 10;
	int* p = &a;
	// a = 20; 这属于直接改动 a 里面的值
	*p = 20;//通过p间接的改动a里面存放的值,*p 等价于 a

	printf(" a = %d\n",  a);// 20
	printf("*p = %d\n", *p);// 20

	return 0;
}

在这里插入图片描述

7.(类型)强制类型转换

  • C 语言允许强制转换操作数的数据类型。做法就是在操作数的前面用小括号将目标数据括起来。
  • 例如下方代码:
printf("整型输出:%d\n",1 + (int)1.8);
//将浮点型的 1.8 强制转换为整型.

在这里插入图片描述

  • 并没有像想象中的那样进行四舍五入,因为 C 语言中,将小数强转成整型时,是直接丢弃小数部分的值

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

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

相关文章

【ElasticSearch】ES集群搭建、监控、故障转移

文章目录 1、ES集群介绍2、搭建ES集群3、集群状态监控4、集群职责及脑裂5、分布式新增和查询流程6、ES故障转移 1、ES集群介绍 单机的ES做数据存储与搜索&#xff0c;必然面临两个问题&#xff1a; 海量数据存储问题单点故障问题 因此&#xff0c;考虑使用ES集群&#xff1a…

AIGC浪潮席卷,亚马逊云科技携手海尔设计、Nolibox加速工业设计转型

从机器学习算法到深度学习再到强化学习&#xff0c;AI创新浪潮奔流不息。而AIGC&#xff08;AI-generated Content&#xff0c;人工智能生成内容&#xff09;的到来&#xff0c;更是让AI成为众多企业的得力助手&#xff0c;开拓了文本、图像、音视频等领域的天花板。 在洞悉到…

x86架构ubuntu18下运行mgba模拟器

0. 环境 i7 ubuntu18 1. 准备源码 到https://github.com/mgba-emu/mgba/releases下载源码 mgba-0.10.2.tar.gz tar -zvxf mgba-0.10.2.tar.gz cd mgba0.10.2 2. 编译 mkdir build cd build cmake -DCMAKE_INSTALL_PREFIX/home/xxjianvm/work/mgba-0.10.2/install .. make -j…

PROFINET转TCP/IP网关TCP/IP协议的含义是

大家好&#xff0c;今天要和大家分享一款自主研发的通讯网关&#xff0c;远创智控YC-PN-TCPIP。这款网关可是集多种功能于一身&#xff0c;PROFINET从站功能&#xff0c;让它在通讯领域独领风骚。想知道这款网关如何实现PROFINET和TCP/IP网络的连接吗&#xff1f;一起来看看吧&…

【GeoDa实用技巧100例】004:绘制长沙市宾馆热度图

文章目录 一、加载宾馆分布数据二、绘制热度图三、加载范围数据四、加载底图数据 一、加载宾馆分布数据 加载专栏配套的案例数据data004.rar中的长沙市宾馆酒店.shp&#xff0c;如下图&#xff0c;选择Shapefile格式&#xff1a; 选择长沙市宾馆酒店&#xff0c;加载如下&…

完全平方数(力扣)动态规划 JAVA

给你一个整数 n &#xff0c;返回 和为 n 的完全平方数的最少数量 。 完全平方数 是一个整数&#xff0c;其值等于另一个整数的平方&#xff1b;换句话说&#xff0c;其值等于一个整数自乘的积。例如&#xff0c;1、4、9 和 16 都是完全平方数&#xff0c;而 3 和 11 不是。 示…

【指针进阶】(题目练习)

这篇文章的思维导图在这里&#xff1a;思维导图 一维数组&#xff1a; int a[] {1,2,3,4}; printf("%d\n",sizeof(a)); printf("%d\n",sizeof(a0)); printf("%d\n",sizeof(*a)); printf("%d\n",sizeof(a1)); printf("%d\n"…

Vit 实战营 Class2:图像与Transformer基础

文章目录 数组图像&#xff1a;图像与像素图像分类&#xff1a;机器如何学习&#xff1f;NMT&#xff1a;Neuron Machine TranslationTransformerVision Transformer代码实战 数组图像&#xff1a;图像与像素 什么是数字图像&#xff1f;在计算机图像的图像格式。每一个点叫pix…

全国节能宣传周丨物通博联智慧能源解决方案助力节能降碳

今年7月10日至16日&#xff0c;为全国第33个节能宣传周。今年全国节能宣传周活动主题是“节能降碳&#xff0c;你我同行”。 全国节能宣传周活动是在1990年国务院第六次节能办公会议上确定的活动周&#xff0c;开展该活动是实施全面节约战略、开展节能降碳宣传教育、推动形成绿…

ros系统生成kinova双臂机器人moveit配置包方法,详细过程,亲测有效!

环境&#xff1a;ubuntu18.04 ros&#xff1a;melodic 此博客前提你已经安装了moveit&#xff0c;如果未安装&#xff0c;可参考链接 一、启动MoveIt Setup Assistant roslaunch moveit_setup_assistant setup_assistant.launch点击&#xff1a;Create New MoveIt Configurat…

听产品大佬谈大语言模型的商业化价值

今年 3 月以来&#xff0c;全球各大厂商陆续发布大语言模型&#xff0c;无数人欢欣鼓舞&#xff0c;庆祝沉寂了几年的 AI 领域重新焕发生机。 然而热闹过后&#xff0c;一个现实的问题摆在面前&#xff1a;大语言模型的商业化价值该如何挖掘&#xff1f; 来自美洽的资深产品经…

CVE-2021-41773

CVE-2021-41773 Apache Httpd Server 路径穿越漏洞 Httpd&#xff08;即 HTTP Daemon &#xff0c;超文本传输协议守护程序的简称&#xff09;是一款运行于网页服务器后台&#xff0c;等待传入服务器请求的软件。HTTP 守护程序能自动回应服务器请求&#xff0c;并使用 HTTP 协…

fastadmin调试前端js

当键盘按键抬起后打印id #username&#xff0c;点击箭头的除缓存 隐藏前端昵称 设置为 style"sidplay:none" 添加管理员组别的时候把此处的 NULL改为 1 就可以默认选择第一组别

springboot生鲜交易系统

生鲜交易管理方面的任务繁琐,以至于交易市场每年都在生鲜交易管理这方面投入较多的精力却效果甚微,生鲜交易系统的目标就是为了能够缓解生鲜交易管理工作方面面临的压力,让生鲜交易管理方面的工作变得更加高效准确。 本项目在开发和设计过程中涉及到原理和技术有: B/S、java技…

css 绘制直角梯形 和 平行四边形

<div:class"{isFirst: index 0,tab_item: index ! 0,}":style"{width: item?.label?.length > 4 ? 206px : 137px,}"><div>{{ item.label }}</div></div> isFirst是直角梯形 tab_item是平行四边形 直角梯形 .isFirstcur…

计算机系统结构与操作系统实验三(5)-中断

&#x1f4cd;实验要求 将中断处理程序放到C里编写 &#x1f4cd;实验过程 鉴于代码相比之前&#xff0c;多出了很多配套的固定代码&#xff0c;因此代码量和代码中来突增&#xff0c;本文就不再一个一个贴代码了&#xff0c;需要的直接去看我上传在csdn的代码吧(文末有链接…

音视频绕不开的话题之WebRTC

什么是WebRTC&#xff1f; 闲来无事&#xff0c;我们今天探讨下音视频绕不开的一个话题&#xff1a;WebRTC。WebRTC之于音视频行业&#xff0c;无异于FFMpeg&#xff0c;可以说WebRTC的开源&#xff0c;让音视频行业大跨步进入发展快车道。 WebRTC是一个支持实时音视频通信的开…

mac系统终端运行python文件

1.在要运行的python文件首行里添加python解释器路径代码 代码&#xff1a; #!/usr/bin/env python3 注意:上面代码中的python3是对应当前的python版本 例子&#xff1a; 2.复制要运行的python文件位置&#xff0c;在终端使用代码进入要运行的文件位置 终端运行代码&…

架构训练营3:架构设计流程和架构师职责

架构师相关职责&#xff1a; 架构师是业务和技术之间的桥梁&#xff0c;架构师不能只顾技术&#xff0c;不懂业务&#xff0c;架构师很容易两头不讨好 三个核心能力&#xff1a; 判断&#xff1a;1业务理解力2.技术能力3.沟通能力 拆解&#xff1a;1技术深度2.技术宽度3.技术…

出差在外,远程访问企业局域网象过河ERP系统【内网穿透】

文章目录 概述1.查看象过河服务端端口2.内网穿透3. 异地公网连接4. 固定公网地址4.1 保留一个固定TCP地址4.2 配置固定TCP地址 5. 使用固定地址连接 概述 ERP系统对于企业来说重要性不言而喻&#xff0c;不管是财务、生产、销售还是采购&#xff0c;都需要用到ERP系统来协助。…