操作符详解(下)——包含整形提升

news2025/4/16 15:48:59

1.讲解剩下的操作符

1.1:逗号表达式

逗号表达式,就是用逗号隔开的多个表达式。
在这里插入图片描述

逗号表达式,从左向右依次执⾏。整个表达式的结果是最后⼀个表达式的结果

例题1:
//C的值是多少?
int main()
{
	int a = 1;
	int b = 2;
	int c = (a > b, a = b + 10, a, b = a + 1);
	printf("%d", c);
	return 0;
}

a>b为假,返回值为0; a=b+10,a的值变为12;b=a+1,b的值变为13,则表达式b=a+1的返回值为13,因此整个表达式的值为13,即c=13。

例题2:

在这里插入图片描述

1.2:下标引用操作符[ ]

int arr[5] = { 1,2,3,4,5 };//这里的[ ]是定义数组时的语法要求,不是下标引用操作符
arr[3] = 0;//这里的[ ]是下标引用操作符,它的操作数是数组名arr与下标3

1.3:函数调用操作符( )

它有⼀个或者多个操作数:第⼀个操作数是函数名,剩余的操作数就是传递给函数的参数。

#include <stdio.h>
void test1()
{
	printf("hehe\n");
}
void test2(const char* str)
{
	printf("%s\n", str);
}
int main()
{
	test1(); //这⾥的()就是作为函数调⽤操作符,它的操作数是函数名test1
	test2("hello bit.");//这⾥的()也是函数调⽤操作符,它的操作数是函数名test2与参数"hello bit."
	return 0;
}

1.4:结构体成员访问操作符:.与->

a.如果知道结构体变量的名字,就可以使用.操作符来访问结构体成员
b.如果知道结构体变量的地址,就可以使用->操作符来访问结构体成员

在这里插入图片描述

2.操作符的优先级与结合性

优先级与结合性是操作符的两个重要属性,它们影响着表达式的执行顺序

2.1:优先级

相邻两个操作符的优先级不同,则哪个操作符的优先级高,先算哪个表达式。
在这里插入图片描述

2.2:结合性

相邻两个操作符的优先级相同,则根据操作符的结合性来判断先算哪个表达式。结合性分为从左往右与从右往左
在这里插入图片描述

2.3:优先级与结合性的表格

在这里插入图片描述

2.4:优先级与结合性的链接

3(略).表达式求值

3.1:整型提升(较难,细细品味)

当两个数据类型进行运算时:
a.若它俩的长度均小于或等于int的长度(4个字节),则需要将它们提升为int类型或者unsigned int类型后,才能进行运算。
有unsigned int就提升为unsigned int,没有就提升为int。
b.若它俩中存在大于int长度(4个字节)的类型,则看哪个类型可以表示的最大值更大,就将另一种类型提升为它这种类型。

3.1.1:整型提升的方法

有符号整数(如signed char、short)进行提升时是按照它的符号位来提升,符号位是什么高位就补什么。
无符号整数(如unsigned char、unsigned short)提升时直接在高位补0

示例1:
int main()
{
	//char是signed char还是unsigned char是取决于编译器的,大多数编译器下(如VS2022)是signed char

	char a = 10;
	//a占1个字节,a的补码:00001010
	char b = 120;
	//同理b的补码:01111000
	char c = a + b;
	//a与b都是char类型,均小于4个字节,因此二者相加前都要提升为int类型
	/*
	1.将a提升为int类型
	a是signed char,将它提升为int类型时,是按照它的符号位来提升的,符号位是什么就补什么
	a提升为int类型后的补码:00000000000000000000000000001010
	
	2.将b提升为int类型
	b是signed char,将它提升为int类型时,是按它的符号位来提升的,符号位是什么就补什么
	b提升为int类型后的补码:00000000000000000000000001111000
	                 
	3.再计算a+b
	a+b的补码:00000000000000000000000010000010
	将a+b的值存到c中,由于c是char类型,只能存8个比特位,因此c中存储的是10000010
	*/
	printf("%d\n", c);
	//%d是打印int类型的数据,而c是char类型的数据,因此要将c提升为int类型
	//c是signed char,将它提升为int类型时,是按它的符号位来提升的,符号位是什么就补什么
	//c的补码:10000010
	//将c提升为int类型后的补码:11111111111111111111111110000010 (最高位为1,说明是负数)
	//将c提升为int类型后的原码:10000000000000000000000001111110,即-126
	return 0;
}
示例2:将示例1中打印c时的%d该成%u,打印的结果是多少?
int main()
{
	//char是signed char还是unsigned char是取决于编译器的,大多数编译器下(如VS2022)是signed char

	char a = 10;
	//a占1个字节,a的补码:00001010
	char b = 120;
	//同理b的补码:01111000
	char c = a + b;
	//a与b都是char类型,均小于4个字节,因此二者相加前都要提升为int类型
	/*
	1.将a提升为int类型
	a是signed char,将它提升为int类型时,是按照它的符号位来提升的,符号位是什么就补什么
	a提升为int类型后的补码:00000000000000000000000000001010

	2.将b提升为int类型
	b是signed char,将它提升为int类型时,是按它的符号位来提升的,符号位是什么就补什么
	b提升为int类型后的补码:00000000000000000000000001111000

	3.再计算a+b
	a+b的补码:00000000000000000000000010000010
	将a+b的值存到c中,由于c是char类型,只能存8个比特位,因此c中存储的是10000010
	*/
	printf("%u\n", c);
	//%u是打印unsigned int类型的数据,而c是char类型的数据,因此要将c提升为unsigned int类型
	//c是signed char,将它提升为int类型时,是按照它的符号位来提升的,符号位是什么就补什么
	//c的补码:10000010
	//
	//c提升为unsigned int类型后的补码:11111111111111111111111110000010
	//c提升为unsigned int类型后的原码:11111111111111111111111110000010,即4294967170
	return 0;
}

3.表达式求值

3.1:整型提升(较难,细细品味)

3.1.1:何为整型提升?

C语⾔中整型算术运算总是⾄少以缺省(默认)整型类型的精度来进⾏的。为了获得这个精度,表达式中的字符和短整型操作数在使⽤之前被转换为普通整型,这种转换称为整型提升。

3.1.2:整型提升的意义

表达式的整型运算要在CPU的相应运算器件内执⾏,CPU内整型运算器(ALU)的操作数的字节⻓度⼀般就是int的字节⻓度,同时也是CPU的通⽤寄存器的⻓度。因此,即使两个char类型的相加,在CPU执⾏时实际上也要先转换为CPU内整型操作数的标准⻓度。

通⽤CPU(general-purpose CPU)是难以直接实现两个8⽐特字节直接相加运算(虽然机器指令中可能有这种字节相加指令)。所以,表达式中各种⻓度可能⼩于int⻓度的整型值,都必须先转换为int或unsigned int,然后才能送⼊CPU去执⾏运算。

3.1.3:如何进行整型提升?

有符号整数(如signed char、short)进行提升时是按照它的符号位来提升,符号位是什么高位就补什么。无符号整数(如unsigned char、unsigned short)提升时直接在高位补0

3.1.4:相关例题
示例1:
int main()
{
	//char是signed char还是unsigned char是取决于编译器的,大多数编译器下(如VS2022)是signed char

	char a = 10;
	//a占1个字节,a的补码:00001010
	char b = 120;
	//同理b的补码:01111000
	char c = a + b;
	//a与b都是char类型,均小于4个字节,因此二者相加前都要提升为int类型
	/*
	1.将a提升为int类型
	a是signed char,将它提升为int类型时,是按照它的符号位来提升的,符号位是什么就补什么
	a提升为int类型后的补码:00000000000000000000000000001010
	
	2.将b提升为int类型
	b是signed char,将它提升为int类型时,是按它的符号位来提升的,符号位是什么就补什么
	b提升为int类型后的补码:00000000000000000000000001111000
	                 
	3.再计算a+b
	a+b的补码:00000000000000000000000010000010
	将a+b的值存到c中,由于c是char类型,只能存8个比特位,因此c中存储的是10000010
	*/
	printf("%d\n", c);
	//%d是打印int类型的数据,而c是char类型的数据,因此要将c提升为int类型
	//c是signed char,将它提升为int类型时,是按它的符号位来提升的,符号位是什么就补什么
	//c的补码:10000010
	//将c提升为int类型后的补码:11111111111111111111111110000010 (最高位为1,说明是负数)
	//将c提升为int类型后的原码:10000000000000000000000001111110,即-126
	return 0;
}
示例2:将示例1中打印c时的%d该成%u,打印的结果是多少?
int main()
{
	//char是signed char还是unsigned char是取决于编译器的,大多数编译器下(如VS2022)是signed char

	char a = 10;
	//a占1个字节,a的补码:00001010
	char b = 120;
	//同理b的补码:01111000
	char c = a + b;
	//a与b都是char类型,均小于4个字节,因此二者相加前都要提升为int类型
	/*
	1.将a提升为int类型
	a是signed char,将它提升为int类型时,是按照它的符号位来提升的,符号位是什么就补什么
	a提升为int类型后的补码:00000000000000000000000000001010

	2.将b提升为int类型
	b是signed char,将它提升为int类型时,是按它的符号位来提升的,符号位是什么就补什么
	b提升为int类型后的补码:00000000000000000000000001111000

	3.再计算a+b
	a+b的补码:00000000000000000000000010000010
	将a+b的值存到c中,由于c是char类型,只能存8个比特位,因此c中存储的是10000010
	*/
	printf("%u\n", c);
	//%u是打印unsigned int类型的数据,而c是char类型的数据,因此要将c提升为unsigned int类型
	//c是signed char,将它提升为int类型时,是按照它的符号位来提升的,符号位是什么就补什么
	//c的补码:10000010
	//
	//c提升为unsigned int类型后的补码:11111111111111111111111110000010
	//c提升为unsigned int类型后的原码:11111111111111111111111110000010,即4294967170
	return 0;
}

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

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

相关文章

Kairos 的野望:构建“智能体即服务”生态,让万物皆可 “Agent”

随着 AI Agent 成为 AI 领域的主要叙事&#xff0c;AI 赛道的发展也逐渐进入到 2.0 时代。聚焦于 AI Agent 概念本身&#xff0c;其是一种具备感知环境、进行决策和执行任务或服务的智能系统&#xff0c;它们通常能够理解自然语言指令&#xff0c;学习用户偏好&#xff0c;并在…

LeetCode 2968.执行操作使频率分数最大

给你一个下标从 0 开始的整数数组 nums 和一个整数 k 。 你可以对数组执行 至多 k 次操作&#xff1a; 从数组中选择一个下标 i &#xff0c;将 nums[i] 增加 或者 减少 1 。 最终数组的频率分数定义为数组中众数的 频率 。 请你返回你可以得到的 最大 频率分数。 众数指的…

多模态智能体框架MM-StoryAgent:跨模态叙事视频生成的技术突破

一、研究背景与核心价值 由上海交通大学与阿里巴巴联合研发的MM-StoryAgent系统,基于多智能体协同框架实现了故事创作到视频生成的完整自动化流程。该系统通过整合文本、视觉、语音、音效等多模态生成技术,构建了包含角色一致性保持、跨模态适配优化等创新机制的叙事内容生产…

Codeforces Round 1013 (Div. 3)

Problem - A - Codeforces 解题思路&#xff1a; 对每个需要的数字进行计数 #include<bits/stdc.h> using namespace std;int main() {int t;cin >> t;while (t--){int n;cin >> n;int two 2;int zero 3;int five 1;int three 1;int one 1;int flag …

银河麒麟系统虚拟机网络ping不通的解决方法

问题描述&#xff1a;使用NAT模式搭建了银河麒麟系统虚拟主机&#xff0c;虚拟机内部可以联网&#xff0c;可以查询到具体的ip地址&#xff0c;同时也可以在虚拟机内部ping同宿主机ip&#xff0c;但使用宿主机却无法ping同银河麒麟虚拟机ip&#xff0c;使用ssh、ftp、sftp等工具…

大数据学习(105)-大数据组件分析

&#x1f34b;&#x1f34b;大数据学习&#x1f34b;&#x1f34b; &#x1f525;系列专栏&#xff1a; &#x1f451;哲学语录: 用力所能及&#xff0c;改变世界。 &#x1f496;如果觉得博主的文章还不错的话&#xff0c;请点赞&#x1f44d;收藏⭐️留言&#x1f4dd;支持一…

基于SpinrgBoot+Vue的医院管理系统-026

一、项目技术栈 Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SpringBoot 前端&#xff1a;Vue开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#xff1a;是 二、功能介绍 (1)…

LLM 为什么使用ID,每个单词不都是有编码的吗

LLM 为什么使用ID,每个单词不都是有编码的吗 在自然语言处理(NLP)里,把文本转换为整数 ID 来表示是一种常见的做法,以下为你详细阐述使用 ID 的原因,以及是否每个单词都有编码。 使用 ID 的原因 1. 计算机可处理性 计算机没办法直接处理文本数据,因为文本是人类使用的…

转行嵌入式,需要自学多久?

作为一个本硕都学机械&#xff0c;却阴差阳错进入嵌入式行业的老兵&#xff0c;这个问题我能聊一整天。十几年前我还在工厂车间穿着工装和机床打交道&#xff0c;偶然接触到单片机后就一发不可收拾。 转行这条路我走得异常艰辛&#xff0c;踩过的坑比写过的代码还多。去年我终…

【Leetcode-Hot100】移动零

题目 解答 首先&#xff0c;使用的解题思路是&#xff1a;使用两个指针&#xff0c;分别指向数组的第一个0元素位置&#xff0c;以该元素位置1为起始点寻找接下来第一个非0元素位置。二者确定后&#xff0c;对其进行交换。随后继续寻找下一个0元素位置。重复上述操作。 但第一…

leetcode_203. 移除链表元素_java

203. 移除链表元素https://leetcode.cn/problems/remove-linked-list-elements/ 1、题目 给你一个链表的头节点 head 和一个整数 val &#xff0c;请你删除链表中所有满足 Node.val val 的节点&#xff0c;并返回 新的头节点 。 示例 1&#xff1a; 输入&#xff1a;head …

常见算法模板总结

文章目录 一、二叉树1. DFS2. BFS 二、回溯模板三、记忆化搜索四、动态规划1. 01背包朴素版本滚动数组优化 2. 完全背包朴素版本滚动数组优化 3. 最长递增子序列LIS朴素版本贪心二分优化 4. 最长公共子序列5. 最长回文子串 五、滑动窗口六、二分查找七、单调栈八、单调队列九、…

UE5学习笔记 FPS游戏制作44 统一UI大小 sizeBox

如果我们希望多个类似的UI大小一样&#xff0c;例如不同菜单的标题&#xff0c;可以使用sizeBox组件 我们在标题控件上&#xff0c;用sizeBox包裹所有子物体 然后指定他的最小宽高&#xff0c;或最大宽高 如果指定的是最小宽高&#xff0c;当子元素&#xff08;如图片&#xf…

C++学习之服务器EPOLL模型、处理客户端请求、向客户端回复数、向客户端发送文件

目录 1.启动epoll模型 2.和客户端建立新连接 3.接受客户端Http请求数据 4.代码回顾从接受的数据中读出请求行 5.请求行解析 6.正则表达式以及匹配 7.解析请求行以及后续处理 8.对path处理说明 9.如何回复响应数据 10.对文件对应content-type如何查询 11.服务器处理流…

BUUCTF-web刷题篇(17)

26.BabyUpload 源码&#xff1a;https://github.com/imaginiso/GXY_CTF/tree/master/Web/babyupload 查看题目源码&#xff1a; 写着&#xff1a;SetHandler application/x-httpd-php 通过源码可以看出这道文件上传题目主要还是考察.htaccess配置文件的特性&#xff0c;倘若…

国网B接口协议调阅实时视频接口流程详解以及检索失败原因(电网B接口)

文章目录 一、B接口协议调阅实时视频接口介绍B.6.1 接口描述B.6.2 接口流程B.6.3 接口参数B.6.3.1 SIP头字段B.6.3.2 SIP响应码B.6.3.3 SDP参数定义B.6.3.4 RTP动态Payload定义 B.6.4 消息示例B.6.4.1 调阅实时视频请求B.6.4.2 调阅实时视频请求响应 二、B接口调阅实时视频失败…

windows11下pytorch(cpu)安装

先装anaconda 见最下方 Pytorch 官网&#xff1a;PyTorch 找到下图&#xff08;不要求版本一样&#xff09;&#xff08;我的电脑是集显&#xff08;有navdia的装gpu&#xff09;&#xff0c;装cpu&#xff09; 查看已有环境列表 创建环境 conda create –n 虚拟环境名字(…

NVR接入录像回放平台用EasyCVR打造地下车库安防:大型商居安全优选方案

一、背景分析 随着居民生活品质的提升&#xff0c;大型商业建筑和住宅小区纷纷配套建设地下停车库。但是地下车库盗窃、失火、恶意毁坏车辆、外部人员随意进出等事件频发&#xff0c;部署视频监控系统成为保障地下车库的安全关键举措。 目前&#xff0c;很多商业和住宅都会在…

乾元通渠道商中标川藏铁路西藏救援队应急救援装备项目

乾元通渠道商中标川藏铁路西藏救援队应急救援装备项目&#xff0c;项目内通信指挥车基于最新一代应急指挥车解决方案打造&#xff0c;配合乾元通自研的车载多链路聚合路由及系统&#xff0c;主要用途为保障应急通讯&#xff0c;满足任务执行时指挥协调、通信联络及数据传输的要…

左右开弓策略思路

一、策略概述 本策略是一种基于多种技术指标的复杂交易策略&#xff0c;包括自定义指标计算、过滤平滑处理以及交易信号生成。 该策略通过不同的交易平台代码段实现&#xff0c;旨在通过分析历史价格数据来预测未来价格走势&#xff0c;并据此生成交易信号。 二、主要技术指标…