C语言(操作符)2

                       Hi~!这里是奋斗的小羊,很荣幸各位能阅读我的文章,诚请评论指点,关注+收藏,欢迎欢迎~~     

                        💥个人主页:小羊在奋斗

                        💥所属专栏:C语言   

        本系列文章为个人学习笔记,在这里撰写成文一为巩固知识,二为同样是初学者的学友展示一些我的学习过程及心得。文笔、排版拙劣,望见谅。 

                                        5、逗号表达式

                                        6、结构体成员访问操作符

                                                        6.1结构体

                                                        6.2结构体变量的初始化

                                                        6.3结构体成员访问操作符

                                        7、表达式求值

                                                        7.1整型提升

                                                        7.2算数转换

                                                        7.3问题表达式

 5、逗号表达式

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

        注意:千万不要想当然的以为整个表达式的结果是最后一个表达式的结果就直接去算最后一个表达式,一定要从左到右每个表达式都执行。 

        另外,逗号表达式还有一个神奇的用法,来看示例:

        这两个代码的效果是一样的,第二种运用了逗号表达式从左向右依次执行的特点,使代码更简单一些。 

6、结构体成员访问操作符

        6.1结构体

        C语言已经提供了内置类型,如:char、int、float、double、short等,但只是这些内置类型还是不够的。如果我们想描述一个复杂的个体,比如一个人、一本书,这时单一的内置类型是不行的。因为对于人而言,人有名字,有体重,有身高,有年龄;对于书而言,书有名字,有作者,有出版社,有定价等。那为了解决这个问题,C语言增加了结构体这种自定义的数据类型,让我们可以自己创建合适的类型。

        结构体是一些值的集合,这些值称为结构体成员变量。结构体的每个成员可以是不同类型的变量,如:标量、数组、指针、其他结构体。

        定义结构体:

        比如我们定义一个学生类型:

        对于结构体类型我们一定要保持头脑清醒,不然很容易云里雾里。我们首先定义了一个学生类型(struct student),在主函数中,我们用定义的学生类型分别创建了一个结构体变量 s1 和 s2 ,还用 int 类型创建了一个整型变量 a,struct student 和 int 都是数据类型,它们的本质是一样的。

        定义一个结构体类型,就像工程师在建造房子之前先要画图纸一样,画好了图纸,就可以根据这个图纸来建造相应的房子,虽然我们最终建造的房子颜色、风格、房间布局不尽相同,但是房子的框架是一样的。同样的,我们可以使用自定义的结构体类型(图纸)来创建变量(房子),所创建的变量内部的值是不尽相同的(房屋风格)。

        还有,我们定义的结构体类型里面是不能存放数据的,它只是一个模板,就像工程师画好的图纸还不能住人一样。造房子的前提是你得先画好图纸,你想造什么样的房子就画什么样的图纸,画好之后你就可以根据图纸造不同风格的房子。

        我们同样可以用结构体类型创建局部变量和全局变量:

        可以看到,我们有3个地方创建结构体变量。 

        6.2结构体变量的初始化

        

        我们一层一层的给我们定义的结构体类型内的成员变量赋值就行。当然,结构体也是可以嵌套的:

         6.3结构体成员访问操作符

        在给结构体变量初始化后,也可以把它拿出来,这就用到了结构体成员访问操作符 “  ”。

         用法为:结构体变量.结构体成员名

        还有一个结构体成员访问操作符 “—>”,这个是依赖指针的,后面再探讨。

7、表达式求值

        7.1整型提升

        C语言中整型算术运算总是至少以缺省(默认)整型类型的精度来进行的。

        为了获得这个精度,表达式中的字符和短整型操作数在使用之前被转换为普通整型,这种转换就称为整型提升。

        整型提升的意义:

        表达式的整型运算要在CPU的相应运算器件内执行,CPU内整型运算器(ALU)的操作数的字节长度一般都是int的字节长度,同时也是CPU的通用寄存器的长度。因此,即使两个char类型的相加,在CPU中执行时也要转换为CPU内整型操作数的标准长度。

        通用CPU是难以直接实现两个8比特字节直接相加运算的,所以,表达式中各种长度可能小于int长度的整型值,都必须先转换为int或unsigned int,然后才能送入CPU去执行。

        如何进行整型提升?

        (1)有符号整数提升是按照变量的数据类型的符号位来提升的; 

        (2)无符号整数提升,高位补0。 

         来看下面几个示例:

        当我们整型与整型相加的时候,不需要整型提升。

 

        在上面的代码中,就需要整型提升。具体过程比较绕,还请耐心理解。

        上面就是打印结果是44的原因。

        事实上,我们知道char类型也被归为整形家族,也分有符号的char和无符号的char。int默认是signed int,那char是不是默认是signed char呢?其实不然,这个是取决于编译器的,只是在VS上char默认是signed char。之前的文章中说过signed char的取值范围是:-128~127,所以它根本就存不了100和200相加的值,来看下面的图:

        就像上图表达的意思一样,数范围的变化是轮回的,对于300来说它轮回了一圈半,最终的值就是44。上面的内容都是计算机内部悄悄发生的,表面看不到,我们看到的只是结果。 

        7.2算数转换

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

1 long double
2 double
3 float
4 unsigned long int
5 long int
6 unsigned int
7 int

         如果某个操作数的类型在上面这个列表中排名靠后,则首先要转化为另一个操作数的类型后执行运算。

 

        7.3问题表达式

        何为问题表达式?即使有了操作符的优先级和结合性,我们写出的代码(表面没有任何问题的代码)也不能确定唯一的计算路径,也就得不到唯一的值,那这个代码就是存在风险的,我们应该避免写成这样的代码。

        我们来看几个例子:

        

        虽然我们知道 “ * ” 的优先级高于 “ + ” 的优先级,但我们并不能确定在计算完前两个 “ * ” 后到底是先计算第一个 “ + ” ,还是计算第三个 “ * ”,同样编译器也确定不了,在不同的编译器中得到的结果是不同的。 

         

        类似例子1,在这个代码中虽然我们能确定 “ * ” 和 “ + ” 哪个先执行,但也不能确定是先执行完三个函数调用,还是执行完后两个函数调用后先计算 “ * ”,同样在不同的编译器中得到的结果也是不一样的。

        

        这个例子还是一样的道理,我们确定不了是先执行三个自增表达式,还是执行完前两个自增表达式后相加,在不同的编译器中也会得到不同的结果。

        像这样的例子还有很多,我们应该避免写出这样复杂且愚蠢的代码,否则就是害人害己。

                                          点击跳转主页—> 💥个人主页小羊在奋斗

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

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

相关文章

[C++]智能指针的实现:auto_ptr, shared_ptr, weak_ptr

auto_ptr 简介 交换资源的管理权&#xff0c;将被拷贝资源置空&#xff0c;很危险&#xff0c;一般被禁用 代码实现 namespace memory {template<typename T>class auto_ptr{public:auto_ptr(T* ptr):_ptr(ptr){}auto_ptr(auto_ptr<T>& ap){_ptr ap._ptr;…

快速话术本(常用文本快速复制工具)EXE成品+软件源码

功能介绍 经常性需要重复性的输入几个不同的文本&#xff0c;来回复制很麻烦&#xff0c;这个小工具可以帮你解决&#xff0c;把要经常输入的文本添加进去&#xff0c;点击即可复制~ 链接&#xff1a;https://pan.baidu.com/s/1TqtJ_Xb10k4j3dxSRjz47Q?pwdsl4l 提取码&…

38.分布式文件系统 - Minio

文章目录 分布式文件系统MinIO安装和启动docker中MinIO的使用podman 虚拟机里使用Docker启minio配置&#xff08;成功访问&#xff09; Java连接minio 分布式文件系统 MinIO 官网&#xff1a;[https://min.io] 中文&#xff1a;[https://www.minio.org.cn/] [http://docs.mi…

Guid转换为字符串

在理想情况下&#xff0c;任何计算机和计算机集群都不会生成两个相同的GUID。GUID 的总数达到了2128&#xff08;3.41038&#xff09;个&#xff0c;所以随机生成两个相同GUID的可能性非常小&#xff0c;但并不为0。GUID一词有时也专指微软对UUID标准的实现。 (1). GUID&#…

如何避免在抓取Google时被屏蔽?代理IP的7个使用误区

在当今数字化时代&#xff0c;数据采集和网络爬取已成为许多企业和个人必不可少的业务活动。对于爬取搜索引擎数据&#xff0c;特别是Google&#xff0c;使用代理IP是常见的手段。然而&#xff0c;使用代理抓取Google并不是一件轻松的事情&#xff0c;有许多常见的误区可能会导…

【FFmpeg】Filter 过滤器 ① ( FFmpeg 过滤器简介 | 过滤器概念 | 过滤器用法 | 过滤器工作流程 | 过滤器文档 | 过滤器分类 )

文章目录 一、FFmpeg 过滤器 Filter 简介1、FFmpeg 过滤器概念2、FFmpeg 过滤器用法3、FFmpeg 过滤器工作流程4、FFmpeg 过滤器文档 二、FFmpeg 过滤器 分类1、过滤器分类 - 根据处理数据类型分类2、过滤器分类 - 根据编码器位置分类3、过滤器分类 - 根据功能分类 FFmpeg 相关文…

typescript的入门到吐槽:看了typescript,发现前端真的卷,

typescript TypeScript 是一种由微软开发的自由和开源的编程语言。它是 JavaScript 的一个超集&#xff0c;而且本质上向这个语言添加了可选的静态类型和基于类的面向对象编程。 TypeScript 与 JavaScript 的区别 其实就是对JavaScript的封装&#xff0c;把一个弱类型语言封…

刨析YOLOv8的改进模块

1、YOLOv5回顾 这里粗略回顾一下,这里直接提供YOLOv5的整理的结构图吧:Backbone:CSPDarkNet结构,主要结构思想的体现在C3模块,这里也是梯度分流的主要思想所在的地方;PAN-FPN:双流的FPN,必须香,也必须快,但是量化还是有些需要图优化才可以达到最优的性能,比如cat前后…

淘宝扭蛋机小程序,开启你的惊喜探索之旅!

亲爱的淘宝用户们&#xff0c;我们非常高兴地宣布&#xff0c;全新的淘宝扭蛋机小程序即将上线&#xff01;这是一款集合了趣味、惊喜与购物乐趣于一体的创新应用&#xff0c;让你在淘宝的海洋里&#xff0c;找到那份独特的快乐。 一、淘宝扭蛋机小程序是什么&#xff1f; 淘…

Qt与MySQL连接

QT连接Mysql数据库&#xff08;详细成功版&#xff09;-CSD N博客 我的MySQL是64位的&#xff0c;所以我的Qt的套件也需要是64位的 遇到的问题&#xff1a; &#xff08;available drivers中已经有QMYSQL QMYSQL3&#xff0c;还是not loaded&#xff09; QSqlDatabase: QMYS…

RAG 检索的底座:Milvus Cloud向量数据库

在业界实践中,RAG 检索通常与向量数据库密切结合,也催生了基于 ChatGPT + Vector Database + Prompt 的 RAG 解决方案,简称为 CVP 技术栈。这一解决方案依赖于向量数据库高效检索相关信息以增强大型语言模型(LLMs),通过将 LLMs 生成的查询转换为向量,使得 RAG 系统能在向…

团结引擎+OpenHarmony 3 通信

团结引擎和鸿蒙之间通信 因为 ts 并没有像 JAVA 有反射的调用&#xff0c;所以我们必须要像 Web GL 平台一样通过导出的行为告诉引擎到底哪些 ts 的接口可以给 C# 来调用。 1 在 Tuanjie 引擎里 需要一个tsllib文件&#xff0c;用于设置给导出对象 C#使用。就可以直接创建以 …

C++ | Leetcode C++题解之第72题编辑距离

题目&#xff1a; 题解&#xff1a; class Solution { public:int minDistance(string word1, string word2) {vector<vector<int>> dp(word1.size() 1, vector<int>(word2.size() 1, 0));for (int i 0; i < word1.size(); i) dp[i][0] i;for (int j…

大模型的概念与特点

在人工智能的浩瀚星空中&#xff0c;大模型犹如一颗璀璨的明星&#xff0c;引领着技术发展的方向。它们以巨大的参数规模和复杂的计算结构&#xff0c;展现出前所未有的智能潜力。本小节将从大模型的基本概念出发&#xff0c;逐步深入解析其发展历程、特点、分类以及泛化与微调…

实用 Chrome 指令

实用 Chrome 指令 Google Chrome 作为广泛使用的浏览器&#xff0c;提供了丰富的快捷键和命令行指令&#xff0c;提高用户的浏览体验和生产力。以下是一些常用的 Chrome 快捷键和命令行指令&#xff0c;帮助你更高效地使用 Chrome 浏览器。 一、快捷键&#xff08;Windows &a…

【Java基础】字符串的内存情况及应用场景

String 特点 用双引号引起来的一串字符&#xff0c;字符串不变&#xff0c;它们的值在创建后不能被更改String str"hello";存储在堆中的字符串常量池已经定义过的字符串&#xff0c;再次定义时直接使用已有的字符串String类重写了**boolean equals(object obj)**方…

爱丁堡大学出新招,大小语言模型配合节约成本!

在大语言模型的应用中&#xff0c;往往面临着成本和性能权衡的问题。 一方面&#xff0c;大型LLM的参数量极大&#xff08;如70B&#xff09;&#xff0c;每次调用都可能带来更多的成本&#xff0c;而小型LLM&#xff08;如7B&#xff09;的成本则更容易被接受。 另一方面&am…

若依Ruoyi微服务版,通过docker-compose部署流程和部分坑记录

1 各个子微服务&#xff0c;yml文件修改&#xff0c;如nacos地址等等 【有坑&#xff0c;看下面】 2 后端服务打成jar包&#xff0c;mvn package命令 3 前端项目打包 4 docker目录下有个copy.sh文件&#xff0c;运行&#xff0c;将jar 包复制到 docker相应目录下&#xff0c;总…

接收区块链的CCF会议--NDSS 2025 截止7.10 附录用率

会议名称&#xff1a;Network and Distributed System Security Symposium (NDSS) CCF等级&#xff1a;CCF A类学术会议 类别&#xff1a;网络与信息安全 录用率&#xff1a;2024年接收率19.5% Submissions are solicited in, but not limited to, the following areas: Ant…

RabbitMQ:深入理解高性能消息队列

RabbitMQ&#xff1a;深入理解高性能消息队列 文章目录 RabbitMQ&#xff1a;深入理解高性能消息队列前言一、RabbitMQ概述二、RabbitMQ的核心概念三、RabbitMQ的工作原理一、生产者发送消息二、交换机转发消息三、队列存储消息四、消费者接收并处理消息 四、RabbitMQ的使用场景…