12.操作符详解(位操作符、逗号表达式、下标访问操作符、函数调用操作符、操作数的优先级)

news2024/10/7 20:35:37

这里写目录标题

    • 1.位操作符
      • 1.1左移操作符(<<)
      • 1.2右移操作符(>>)
      • 1.3按位与操作符(&)
      • 1.4按位或操作符(|)
      • 1.5异或操作符(^)
      • 1.6取反操作符(~)
      • 练习
    • 2.逗号表达式
    • 3.下标访问[]、函数调用()
      • 3.1下标引用操作符 [ ]
      • 3.2函数调用操作符 ()
    • 4.操作数的优先级

1.位操作符

1.1左移操作符(<<)

二进制左移运算符。将一个运算对象的各二进制位全部左移若干位(左边的二进制位丢弃,右边补0)。
将操作数的所有位向左移动指定的位数。左移 n 位相当于乘以 2 的 n 次方。

//左移操作符(<<)
int main() {
	int a = 5;//0000 0101 = 5
	int b = a << 1;//0000 1010 = 10
	printf("a << 1 = %d", b);
	return 0;
}

输出结果:
a << 1 = 10


1.2右移操作符(>>)

二进制右移运算符。将一个数的各二进制位全部右移若干位,正数左补 0,负数左补 1,右边丢弃。
将操作数的所有位向右移动指定的位数。右移n位相当于除以 2 的 n 次方。

//右移操作符(<<)
int main() {
	int a = 14;//0000 1110 = 14
	int b = a >> 1;//0000 0111 = 7
	printf("a >> 1 = %d", b);
	return 0;
}

输出结果:
a >> 1 = 7

注意:上述左移和右移操作符是位移运算符,不要移动负数位数,这是标准未定义的。


1.3按位与操作符(&)

对两个操作数二进制的每一位执行逻辑与操作,如果两个相应的位都为 1,则结果为 1,否则为 0。

//按位与(&)
int main() {
	int a = 5;//0000 0101 = 5
	int b = 3;//0000 0011 = 3
			  //0000 0001 = 1
	int result = a & b;
	printf("a & b = %d", result);
	return 0;
}

输出结果:
a & b = 1


1.4按位或操作符(|)

对两个操作数二进制的每一位执行逻辑或操作,如果两个相应的位都为 0,则结果为 0,否则为 1。

//按位或(|)
int main() {
	int a = 5;//0000 0101 = 5
	int b = 3;//0000 0011 = 3
			  //0000 0111 = 7
	int result = a | b;
	printf("a | b = %d", result);
	return 0;
}

输出结果:
a | b = 7


1.5异或操作符(^)

对两个操作数二进制的每一位执行逻辑异或操作,如果两个相应的位值相同,则结果为 0,否则为 1。

//按位异或(^)
int main() {
	int a = 5;//0000 0101 = 5
	int b = 3;//0000 0011 = 3
			  //0000 0110 = 6
	int result = a ^ b;
	printf("a ^ b = %d", result);
	return 0;
}

输出结果:
a ^ b = 6

注:&、|、^三种位操作符的操作数必须是整数。


1.6取反操作符(~)

对操作数的每一位执行逻辑取反操作,即将每一位的 0 变为 1,1 变为 0。
取反的具体过程:
1.先将操作数化为补码
2.再对补码进行取反(0 变为 1,1 变为 0)
2.将取反后的补码再转变为原码,得出的值就是原操作数取反后的值。

//取反(~)
int main() {
	int a = 5;
	//a原码:0000 0101 = 5
	//a补码:0000 0101
	int result = ~a;
	//a取反:1111 1010
	//然后再将取反后的补码转换为原码
	//反码:1111 1001
	//原码:1000 0110 = -6
	printf("~a = %d", result);
	return 0;
}

输出结果:
~a = -6

注:&、|、^三种位操作符的操作数必须是整数。


练习

1.在不创建临时变量(第三个变量)的情况下,实现两个数的交换

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

	a = a ^ b;
	b = a ^ b;
	a = a ^ b;
	printf("交换后 a=%d b=%d", a, b);
	return 0;
}

在这里插入图片描述

用个人的话来发现其中的规律,就是两个整数(假设A和B)异或后得到的数(假设为C)
用C去异或A或B其中一个数,所得的数为没有参加异或的那个数。
例如
∵A ^ B = C
∴C ^ A =B或者C ^ B =A
借助这一特性不需要创建临时变量也可以实现两个数的交换。

2.逗号表达式

逗号表达式就是用逗号隔开的多个表达式。
逗号表达式,从左至右一次执行。整个表达式的结果是最后一个表达式的结果。

//代码一
int main() {
	int a = 1,b = 2;
	int c = (a = b -a, a = b + 10, a, b = a + 1);//所以c应该是最后一项b = a + 1的值
	printf("%d", c);
	return 0;
}

输出结果:
13

//代码二
int main() {
	int a = 1, b = 2, c = 3;
	if (a = b + 1, c = a / 2, c > 0) {
		printf("c=%d", c);
	}
	return 0;
}
/*
(a = 3,c=1,1>0) 1>0成立等于1,所以执行if语句
*/

输出结果
c=1


3.下标访问[]、函数调用()

3.1下标引用操作符 [ ]

//数组下标[
int main() {
	int arr[5] = { 1, 2, 3, 4, 5 };
	//	   0  1  2  3  4

	printf("%d", arr[4]);//5
	return 0;
}

arr[4]
下标操作符[]的操作数是:数组名arr 和 4(下标索引位)

3.2函数调用操作符 ()

//函数的定义
int add(int x,int y) {
	int z = x + y;
	return z;
}

//函数调用()
int main() {
	printf("%d", add(1, 2));//3
	return 0;
}

add(1,2)
函数操作符()的操作数是:函数名add,1,2

问题一:
()函数调用操作符最少有几个操作符?
1个,也就是只写个函数名,即无参函数。


问题二:
sizeof()是不是函数呢?
sizeof不是函数,记住不是函数!sizeof是操作符!!!
上代码!

//sizeof是操作符
int main(){
	int a = 10;
	//int n = sizeof(a);
	int n = sizeof a;
	printf("%d\n", n);
	return 0;
}

结果发现sizeof(a)的效果和sizeof a相同,所以证明sizeof不需要函数调用操作符()也能正常运行,而调用函数必须要有()才可以调用。

4.操作数的优先级

在这里插入图片描述

优先级和结合性决定了表达式求值的计算顺序
如果优先级相同,这时看结合性。大部分运算符都是(从左到右执行),少数运算符是右结合(从右到左执行),比如赋值运算符(=)。

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

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

相关文章

SPF9139全力适配ios16与鸿蒙3.0,超实用数据提取、分析、恢复能力UP!

​ 如今&#xff0c;群聊已成为人们必不可少的沟通窗口 家人群&#xff0c;好友群&#xff0c;班级群 粉丝群&#xff0c;交友群&#xff0c;工作群 …… 各类群聊铺天盖地般涌来的同时 也有一些群聊沦为了 赌博、传播淫秽视频、发表不当言论 等违法犯罪行为滋生之地 与…

滑动窗口——缓冲区大小

文章目录 作用处理过程三次握手四次挥手的全部流程 窗口理解为缓冲区的大小&#xff0c;滑动窗口的大小会随着发送数据和接收数据而变化。 通信双方都有发送缓冲区和接收缓冲区。 服务器&#xff1a; 发送缓冲区 接收缓冲区 客户端&#xff1a; 发送缓冲区 接收缓冲区 作用 处…

C++项目,出现debug能正常编译release编译报错的情况

编写了一个DLL库文件&#xff0c;发现可以正常编译生成debug的库&#xff0c;但是release的部分编译报错。列举过程中出现的错误解决办法&#xff1a; 1.报错点&#xff1a;fatal error C1189: #error: Building MFC application with /MD[d] … fatal error C1189: #error: B…

前端进阶html+css04----盒子模型

1.一个盒子由content&#xff08;文本内容)&#xff0c;padding,border,margin组成。 2.盒子的大小指的是盒子的宽度和高度。一般由box-sizing属性来控制。 1&#xff09;默认情况下, 也就是box-sizing: content-box时&#xff0c;盒子的宽高计算公式如下&#xff1a; 盒子宽…

使用 Splashtop Secure Workspace 改进安全访问

前言&#xff1a;Splashtop 首席执行官兼联合创始人 Mark Lee 我们在十多年前推出 Splashtop 远程访问和支持产品线时&#xff0c;专注于为用户提供高性能和卓越的用户体验&#xff0c;以便用户能够随处访问计算资源。如今&#xff0c;我们有25万企业客户和3000万个人用户&…

如何使用Java发邮件

首先要知道一点&#xff0c;发送邮件不需要像发送短信那样购买具体的定制化服务&#xff0c;可以理解为发送短信是一个涉及到具体的物理设备&#xff0c;比如基站等这些东西&#xff0c;而邮件的服务成本没有那么高&#xff0c;它是一个比较纯粹的软件服务。 其次你要知道那个…

Stable Diffusion教程(9) - AI视频转动漫

配套抖音视频教程&#xff1a;https://v.douyin.com/UfTcrcJ/ 安装mov2mov插件 打开webui点击扩展->从网址安装输入地址&#xff0c;然后点击安装 https://github.com/Scholar01/sd-webui-mov2mov 最后重启webui 下载模型 从国内liblib AI 模型站下载模型 LiblibAI哩…

从到店到到家,本土便利店正在围猎外资三巨头

全家在中国市场接连关店约300多家&#xff0c;7-11关闭或迁移全球市场的门店约1000家&#xff0c;罗森深圳公司2022年疑似亏损近8000万。 近三年来&#xff0c;以全家、7-11和罗森三家为代表的外资便利店企业&#xff0c;正在遭遇中国本土便利店品牌从到店到家的双重围猎。 20…

分析一下vue3下会造成响应式丢失的情况

前言 在我们从vue2过渡到vue3的时候&#xff0c;对于数据响应式的变化其实是懵懵懂懂的。从以往直接在data函数里面定义变量到每一次都要使用ref/reactive时&#xff0c;是有些不适应的。但问题不大&#xff0c;毕竟在大前端时代中&#xff0c;如果不及时跟上时代的步伐&#…

在生产环境中部署Elasticsearch:最佳实践和故障排除技巧——聚合与搜索(三)

前言 「作者主页」&#xff1a;雪碧有白泡泡 「个人网站」&#xff1a;雪碧的个人网站 「推荐专栏」&#xff1a; ★java一站式服务 ★ ★ React从入门到精通★ ★前端炫酷代码分享 ★ ★ 从0到英雄&#xff0c;vue成神之路★ ★ uniapp-从构建到提升★ ★ 从0到英雄&#xff…

SDUT 2023 summer team contest(for 22) - 13

B - Hoppers 题意&#xff1a;给你一张无向图&#xff0c;可以选定一个点染色&#xff0c;随后距离为2的点都会被染色(可以传染&#xff09;。求至少需要向图中添加几条边使得选定一个点染色后可以将整个图染色。(不一定是连通图&#xff09; 思路&#xff1a;如果一个连通块是…

代码随想录算法训练营day60

文章目录 Day60 柱状图中最大的矩形题目思路代码 Day60 柱状图中最大的矩形 84. 柱状图中最大的矩形 - 力扣&#xff08;LeetCode&#xff09; 题目 给定 n 个非负整数&#xff0c;用来表示柱状图中各个柱子的高度。每个柱子彼此相邻&#xff0c;且宽度为 1 。 求在该柱状图…

Learning Rich Features for Image Manipulation Detection阅读笔记

文章目录 Abstract3.3. 双线性池 Abstract 图像篡改检测与传统的语义目标检测&#xff08;semantic object detection&#xff09;不同&#xff0c;因为它更关注篡改伪影&#xff08;tampering artifacts&#xff09;而不是图像内容&#xff0c;这表明需要学习更丰富的特征。我…

【Java】异常处理 之 Java的异常

Java的异常 在计算机程序运行的过程中&#xff0c;总是会出现各种各样的错误。 有一些错误是用户造成的&#xff0c;比如&#xff0c;希望用户输入一个int类型的年龄&#xff0c;但是用户的输入是abc&#xff1a; // 假设用户输入了abc&#xff1a; String s "abc&quo…

UNIX网络编程卷一 学习笔记 第二十七章 IP选项

IPv4允许在20字节的首部固定部分后跟最多共40字节的选项。尽管已经定义了10种IPv4选项&#xff0c;但最常用的是源路径选项。我们可通过存取IP_OPTIONS套接字选项访问这些选项&#xff0c;我们存取该套接字选项时&#xff0c;所用的缓冲区中的值就是它们置于IP数据报中的格式。…

南京https证书中的通配符https证书

随着互联网的快速发展&#xff0c;越来越多的网站开始使用HTTPS协议来保证用户的信息安全和隐私。而HTTPS协议的实现离不开HTTPS证书的支持。HTTPS证书是一种数字证书&#xff0c;用于验证网站的身份并加密数据传输。它通过使用公钥加密技术&#xff0c;确保用户与网站之间的通…

Spotfire相关

文章目录 基础架构服务器基础状态管理服务状态查看overviewserver diagnostic&#xff1a;instance 服务器启停 server配置资源池配置 基础架构 SPF DB 存储&#xff1a;用户权限信息、schedule信息、配置信息、建立的dxp文件 服务器基础状态管理 服务状态查看 overview serv…

C++ 指针函数和函数指针

除了void类型的函数之外&#xff0c;函数在调用结束之后都要有返回值&#xff0c;指针也可以是函数的返回值。当一个函数的返回值是指针类型时&#xff0c;这个函数就是指针型函数。 使用指针型函数的最主要目的就是要在函数结束时把大量的数据从被调函数返回到主调函数中。而通…

判断是否在当前页面事件方法

页面可见性 页面可见性介绍 长期以来我们一直缺少一个判断用户是否正在浏览某个指定标签页的方法。用户是否去看别的网站了&#xff1f;他们切换回来了吗&#xff1f;现在html5里页面可见性接口就提供给了程序员一个方法&#xff0c;让他们使用visibilitychange页面事件来判断…

【肌电图信号分析】通道肌电图并查找收缩周期的数量、振幅、最大值和持续时间(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…