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,在这个代码中虽然我们能确定 “ * ” 和 “ + ” 哪个先执行,但也不能确定是先执行完三个函数调用,还是执行完后两个函数调用后先计算 “ * ”,同样在不同的编译器中得到的结果也是不一样的。

        

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

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【JUC】并发编程 AQS,ReentryLock,CyclicBarrier,CountDownLatch 原理总结

AQS AQS是什么?重写AQS就能实现锁的效果? AQS是一个抽象类,是一个并发包的基础组件,用来实现各种锁,同步组件的工具(通过volatile cas进行实现)。它包含了共享成员变量state、等待队列、条件…

6层板学习笔记1

说明:笔记基于6层全志H3消费电子0.65MM间距BGA 目的:掌握各类接口的布局思路和布线,掌握DDR高速存储设计 1、网表的导入是原理图的元件电气连接关系,位号,封装,名称等参数信息的总和 2、原理图文件包含(历史版本记录,功能总框图,电源树,GPIO分配,DDR功能,CPU,US…

【跨境商家必读】TikTok Shop商城运营全指南

随着社交媒体和电子商务之间界限的日益模糊,一种全新的购物平台——TikTok商城,正在迅速成为全球跨境商家们关注的焦点。在这个竞争激烈的TikTok跨境电商领域中,了解如何有效利用TikTok Shop的各项功能,理解其独特的运营模式&…

OpenAI 高管:一年后,你会觉得现在的 ChatGPT 像笑话一样糟糕|TodayAI

OpenAI 的首席运营官 Brad Lightcap 表示,一年后,你会觉得现在的 ChatGPT 像笑话一样糟糕。未来的 ChatGPT 版本将会有重大升级。他还讨论了 AI 取代人类工作和对电网的压力的可能性。 虽然我们不知道 OpenAI 何时会推出 GPT-5,但公司高管已…

视频怎么去水印?这三款工具助你轻松搞定

在视频处理的过程中,水印常常成为我们的一大难题。它不仅影响了视频的美观度,还可能涉及版权问题。那么,如何高效去除视频中的水印呢?接下来,我将为大家推荐三款国内外备受好评的视频去水印工具:水印云、In…

【Linux】基础命令:进程、网络

systemctl命令 控制内置服务 systemctl start | stop | status | enable | disable 服务名 start | stop开启关闭,status状态,enable | disable开启关闭开机自启 date命令 查看系统时间 date [-d] [格式化字符串] date -d “1 day” %Y-%m-%d 修改时区…

数字电商人才孵化基地授牌仪式在天府锋巢直播产业基地隆重举行!

2024年4月25日,数字电商人才孵化基地授牌仪式在天府锋巢直播产业基地隆重举行。此次仪式不仅标志着德商锋巢与天府新区信息技术职业学院的紧密合作正式启动,更意味着双方在数字电商领域的人才培养和产业发展上迈出了坚实的步伐。 仪式现场,德…

中国家装水管十大品牌排行榜:联塑、日丰、金牛、美尔固、弗锐德等品牌上榜

水管作为家居装修中至关重要的一环,其质量直接关系到我们日常生活的安全和舒适。面对市场上琳琅满目的家装水管品牌,选择一款质量可靠、性能优越的产品成为了许多家庭装修的重要课题。为了助你选购时不踩坑,下面就为大家介绍一下中国家装水管…

【日志革新】在ThinkPHP5中实现高效TraceId集成,打造可靠的日志追踪系统

问题背景 最近接手了一个骨灰级的项目,然而在项目中遇到了一个普遍的挑战:由于公司采用 ELK(Elasticsearch、Logstash、Kibana)作为日志收集和分析工具,追踪生产问题成为了一大难题。尽管 ELK 提供了强大的日志分析功…

Sam Altman 在斯坦福大学演讲的 10 个要点

最近在斯坦福大学举行的问答环节中,OpenAI 富有远见的首席执行官 Sam Altman 分享了关于人工智能的未来及其对社会的潜在影响的宝贵见解。作为 GPT 和 DALL-E 等突破性人工智能模型背后的研究组织的联合创始人,Altman 的观点对于企业家、研究人员以及任何…

网盘应用:桌面端界面欣赏,这个赛道容不下小玩家。

网盘(Cloud Storage)是一种云存储服务,允许用户在互联网上存储、管理和共享文件。它提供了一个在线的虚拟硬盘,用户可以通过网络将文件上传到云端,并随时随地访问和管理这些文件。 阿里云盘

Redis集群.md

Redis集群 本章是基于 CentOS7 下的 Redis 集群教程,包括: 单机安装RedisRedis主从Redis分片集群 1.单机安装Redis 首先需要安装Redis所需要的依赖: yum install -y gcc tcl然后将课前资料提供的Redis安装包上传到虚拟机的任意目录&#xf…

为什么你创业总是失败?2024普通人如何创业?2024创业赛道!2024创业新风口!2024创业方向!2024普通人的机会!

为什么你做项目老是不赚钱,是你不够努力吗?是你运气不好吗? 如果都不是!那一定是你的思维逻辑出了问题! 先想一想你以前做的项目,有没有哪个符合以下条件:对客户有价值、寻找客源成本在可接受…

智慧文旅赋能旅游服务升级:以科技创新驱动行业变革,打造智慧化、个性化、高效化的旅游新体验,满足游客日益增长的多元化需求

目录 一、引言 二、智慧文旅的概念与内涵 三、智慧文旅在旅游服务升级中的应用 1、智慧旅游服务平台建设 2、智慧景区管理 3、智慧旅游营销 四、智慧文旅推动旅游行业变革的案例分析 案例一:某智慧旅游城市建设项目 案例二:某景区智慧化改造项目…

Linux进程状态与优先级

本篇详细的讲解了 Linux 中进程会出现的各种状态,以及出现这些状态的原因,其中进程的阻塞、挂起和运行就是进程状态的体现。接着科普了一下进程的切换,然后讲解了进程的优先级,以及如何调整进程的优先级。最后对进程的特点进行了总…

C语言自定义类型中结构体、结构体声明、结构体自引用、结构体变量的定义和初始化、结构体内存对齐,结构体传参,位段等的介绍

文章目录 前言一、结构体二、 结构体声明三、 特殊的声明----匿名结构体类型四、 结构体的自引用(1)数据结构(2)结构体的自引用 五、 结构体变量的定义和初始化六、 结构体内存对齐1. 结构体的对齐规则(1)结…

华为eNSP综合实验-网络地址转换

实验完成之后,在AR1的g0/0/1接口抓包,查看地址转换 实现私网pc访问公网pc 实验命令展示 SW1: vlan batch 12 #创建vlan interface e0/0/1 #进入接口配置vlan端口 port link-type access port default vlan 12 q interface e0/0/2 #进入接口配置vlan端口 port link-type ac…

iphone忘记锁屏密码怎么解锁?这些解锁方法你必须知道!

在使用iPhone的过程中经常会遇到很多问题,比如忘记了iPhone的锁屏密码。面对这样的情况,许多用户可能会感到手足无措。别担心,本文将为您详细介绍iPhone忘记锁屏密码的解锁方法,让您轻松解决这一烦恼。 一、使用iTunes备份恢复 如…

盘点一下4种常见的微信的广告类型,在微信上打广告要花多少钱?

微信是一款社交媒体应用,集Facebook、Instagram和Snapchat的功能于一身。该应用拥有超过12亿的月活跃用户,其中约7亿为日活跃用户。由于其在中国网民中的成功和广泛的通信工具,微信是推广您业务的绝佳平台。 在这篇博客文章中,我…

Centos7完全卸载与安装mysql8.0+

Centos7卸载与安装mysql8.0 1、mysql8完全卸载2、mysql8安装 1、mysql8完全卸载 sudo systemctl stop mysqldsudo yum remove mysql-community-serversudo rm -rf /var/lib/mysql sudo rm -rf /etc/my.cnfsudo groupdel mysql sudo userdel mysqlsudo rm -rf /var/log/mysql s…