【C语言】操作符2(含操作符的应用)

1、单目操作符

        单目操作符有下面几种:

        !、++、--、&(取地址)、*(指针)、+(正号)、-(负号)、~、sizeof、(类型)

        其中就还有&和*操作符还没有学习过,这个我们在后面学习指针的时候会详细来讲的。

2、逗号表达式

        逗号表达式就是用逗号隔开的表达式。如下所示:

        exp1,exp2,exp3,.......expN

        有N个表达式,然后每个表达式用逗号分隔开来。

        其规律为:

        每一个表达式都会进行运算,但是整个逗号表达式的结果是最后一个表达式的结果。

        下面我们通过一个代码来感受一下:

        

           看上面的逗号表达式:先进行a和b比大小,此时不会改变a,b的值,然后这个结果也不是整             个逗号表达式的结果所以也没有给c赋值,然后就是对下一个表达式运算,此时a的值就变                成了12但是也不会赋值给,然后第三个表达式a没有进行任何赋值操作而且也不是最后一                个表达式,所以还是没有对c赋值,然后最后一个表达式使得b的值为13且此时的值也就是              整个逗号表达式的值,所以此时c的值为13

           

               逗号表达式的妙用:

               

                    如上,修改前的代码在使用循环前需要对a进行处理,然后才开始进行循环,然后在                        循环体内在进行完业务出处理后又需要对a进行处理。这时我们可以在循环的判断条                        件语句中使用逗号语句,然后将判断的那个语句放在逗号表达式的最后一个表达式,                      然后对于a的处理的表达式放在前面,这样就可以不用在循环前对a进行操作了。而且                      在循环后也还会对a处理才进行判断,也没有影响原来的逻辑。

3、下标访问呢操作符[ ]、函数调用操作符()

         这两个操作符我们在前面学习数组和函数的时候已经非常熟悉了。

         下标访问操作符[ ]:

         其是一个双目操作符,其操作数,一个为数组名,一个为索引(下标)

         下面为其使用例子:

          

          函数调用操作符():

          接受一个或者多个操作数:第一个操作数是函数名,剩余的操作数就是传递给函数的参数,            而且是必须有函数名这个操作数的,参数的操作数可以有也可以没有,这个看你函数需要实            现功能来决定。比如我们之前写的猜数字游戏和扫雷游戏,我们定义了个实现菜单功能的函            数,其操作数就只有函数名字了没有参数。

          

              

4、结构成员访问操作符

        在这里我们先简单了解一下结构体后续还会专门学习结构体

   1、结构体

         c语言提供了内置类型,如:char、int、short、long、float、double等。但是实际上只有这             些内置类型还是不能满足我们的需求的,假设我要描述一个学生描述一本书,,这时候单一           的数据类型是不行的。

         描述一个学生:名字、年龄、学号、身高、体重等。

         描述一本书:作者、出版社、定价等。

         c语言中为了解决这个问题,增加了结构体这种自己定义的数据类型,让使用者可以根据自             己的需求来定义合适的数据类型。

         

   2、结构体的声明 

        使用关键字:struct  结构体名

         

        上面为结构体的声明,成员列表则为我们需要的具体的数据了,变量列表就是可以在那边创             建结构体变量,也可以省略,但是注意:后面的分号不可以省略。下面我们定义一个学生的           结构体来看看     

         

     3、结构体变量的定义和初始化

          定义:

          结构体的定义有两种方法:

          1、在创建结构体的时候在最后直接写出这个变量,注意后面的分号!!!

            

         2、和定义结构体有一点类似,使用struct关键字然后加上一个名字,然后再加上这个变量的                名字。

                 

       初始化:

       结构体的初始化和数组差不多,也是使用大括号。

       

       第一个初始化就会按照结构体中的数据顺序的初始化,即第一个"zhangsan"就是name的,然         后20就是age的了,第二种就是指定初始化,这个就在要初始化的那个数据加.即可。   

      若结构体中的一个成员也是结构体的话:

      

         这个时候在初始化中要对结构体中的这个结构体成员进行初始化,我们在大括号内再使用大           括号将这个结构体成员的初始化即可。

         

     4、结构成员访问操作符   

          直接访问:

          结构体成员的直接访问是通过点操作符(.)访问的。点操作符接受两个操作数。如下所⽰:

         

          使用方式:结构体变量.成员名 

          间接访问:

          有的时候我们得到的不是一个结构体变量,而是得到了一个指向结构体的指针,这个时候我            们就使用间接访问的方式来访问结构体,即:(->)符号。这里我们就只做简单介绍,因为            还涉及到指针的知识。

5、操作符的属性:优先级,结合性

        C语言的操作符有两个重要的属性:优先性和结合性,这两个属性决定了表达式求值的计算            顺序。

1、优先级

      优先级指的是如果一个表达式包含多个运算符,那么那个运算符先执行呢。各种运算符的优先        级是不一样的。

      如下所示:

      3+4*5;

      上面的表达式中既有加法运算又有乘法运算,由于乘法运算的优先级高于加法,所以表达式是        先计算4*5然后再计算加法。

      运算符的优先级顺序很多下面为其具体情况:

      • 圆括号( () )

      • ⾃增运算符( ++ ),⾃减运算符( -- )

      • 单⽬运算符( + 和 - )

      • 乘法( * ),除法( / )

      • 加法( + ),减法( - )

      • 关系运算符( < 、 > 等)

      • 赋值运算符( = )

      

2、结合性            

      当两个运算符的优先级是一样的时候咋办呢,这个时候优先级就没有办法确定先计算谁了。

      这个时候就得看结合性了,根据运算符是左结合,还是右结合,决定其执行顺序。其中大部分        运算符是左结合(从左到右执行),少数运算符是右结合(从右往左执行)例如:赋值运算符        =。 

     下面为运算符的优先级和结合性:

      

6、整型提升和算术转换

 1、整型提升       

      C语言中整型算术运算总是至少以缺省(默认)整型数据的精度来进行的,为了获得这个精            度,表达式中的字符和整型操作数在使用之前转换为普通整型,这种转换为:整型提升。

      整型提升的意义:

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

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

     如下面的运算: 

    

       这里的b和c都是char类型的数据,在进行后面的运算时候,,会先将其整型提升,提升为普           通整型int,然后在执行加法运算,在加法运算完成后 ,这个时候会有四个字节,要存入a中,         因为a也为char类型数据,所以结果要截断,从四个字节截断成1个字节,也就是将前面三个           字节去掉,然后在存储给a。那么整型提升是如何进行的呢?

       整型提升的方法:

       1、有符号整型提升是按照变量的数据类型的符号位来提升的,高位补符号位

       2、无符号整型提升,高位补0

       下面我们通过一个实例来理解:

        

       

2、算术转换 

     如果某个操作符的各个操作数属于不同的类型,那么我们得将其转换位同一种类型,否则操作       就无法进行。下面的层次体系为寻常算术转换

    

      其等级由上往下降。

7、问题表达式解析  

        表达式1:

        

       表达式2:

   

     同上,操作符的优先级只能决定⾃减--的运算在+的运算的前⾯,但是我们并没有办法得知+操         作符的左操作数的获取在右操作数之前还是之后求值,所以结果是不可预测的,是有歧义的。 

    表达式3:

   

     上面的表达式在不同的编译环境下的结果是不同的。

      

   表达式4: 

      

          上面的表达式虽然在大部分的编译器上结果是一样的。

          但是对于fun()-fun()*fun();这个语句我们只能通过操作符的优先级得知:先算乘法再算减法

          但是函数调用的先后顺序是没办法得知的。

  表达式5:

          

  

 建议:即使有了操作符的优先级和结合性,我们写出的表达式依然有可能不能通过操作符的属性               确定唯⼀的计算路径,那这个表达式就是存在潜在⻛险的,建议不要写出特别复杂的表达               式。 我们可以将其分割成几个表达式,这样对于代码的理解也更加容易,还有后期对于代             码的维护也更加容易。

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

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

相关文章

博客文章怎么设计分类与标签

首发地址&#xff08;欢迎大家访问&#xff09;&#xff1a;博客文章怎么设计分类与标签 新网站基本上算是迁移完了&#xff0c;迁移之后在写文章的过程中&#xff0c;发现个人的文章分类和标签做的太混乱了&#xff0c;分类做的像标签&#xff0c;标签也不是特别的丰富&#x…

【计算机网络】物理层

&#x1f3af; 导读&#xff1a;本文档概述了计算机网络物理层的基础知识&#xff0c;包括物理层的作用、四大任务、传输媒体分类及其特性&#xff0c;深入讲解了调制技术和编码方法如曼彻斯特编码等&#xff0c;探讨了信道的极限容量&#xff0c;介绍了奈氏准则和香农公式&…

【AI赋能电商】数据分析和训练精准导向

AI赋能电商&#xff1a;重塑销售效率与用户体验的新篇章 一、AI驱动的购物推荐系统二、会员分类与精细化运营三、智能商品定价策略四、AI在供应链管理中的应用结语 在当今这个技术日新月异的时代&#xff0c;人工智能&#xff08;AI&#xff09;已不再是一个遥不可及的概念&…

多组织对接方案案例

前言 不同组织间的数据共享和整合&#xff0c;以便实现库存、订单的实时同步。多组织的对接需求往往一个销售订单需要再不同的组织生成不一样的单据&#xff0c;并且完成内部结算&#xff0c;这个案例对接的是金蝶云星空&#xff0c;具备多组织的特性&#xff0c;所以在前期规…

基于YOLOv8深度学习的医学影像肝脏肿瘤病症检测与诊断系统(PyQt5界面+数据集+训练代码)

随着医学影像技术和计算机视觉技术的快速发展&#xff0c;医疗诊断中的自动化工具正逐渐成为临床应用中的研究热点。在肝脏肿瘤的早期检测与诊断中&#xff0c;传统的人工方法耗时较长&#xff0c;且容易受医生的主观经验影响&#xff0c;诊断结果的准确性和一致性难以保证。基…

table元素纯css无限滚动,流畅过度

<template><div class"monitor-table-container"><table class"monitor-table"><thead><th>标题</th><th>标题</th><th>标题</th><th>标题</th></thead><tbody ref&quo…

springboot-事务失效以及排查过程

排查了好久&#xff0c;终于解决&#xff0c;希望这次的排查过程对大家也有帮助&#xff0c;废话少说&#xff0c;上源码 开发环境 springboot 2.3.11 jdk8 gradle6.4 HikariDataSource ps: 本环节使用双数据源&#xff0c;在service层做切面拦截&#xff0c;切换具体的数据源…

Docker入门之Windows安装Docker初体验

在之前我们认识了docker的容器&#xff0c;了解了docker的相关概念&#xff1a;镜像&#xff0c;容器&#xff0c;仓库&#xff1a;面试官让你介绍一下docker&#xff0c;别再说不知道了 之后又带大家动手体验了一下docker从零开始玩转 Docker&#xff1a;一站式入门指南&#…

信息与网络安全

1.对称密码体制的优缺点 优点&#xff1a;1.加密解密处理速度快 2.保密度高&#xff1b; 缺点&#xff1a;1.对称密码算法的密钥 分发过程复杂&#xff0c;所花代价高 2.多人通信时密钥组合的数量会出现爆炸性膨胀&#xff08;所需密钥量大&#xff09; 3.通信双方必须统一密钥…

GPT、Python和OpenCV支持下的空天地遥感数据识别与计算

在科技飞速发展的时代&#xff0c;遥感数据的精准分析已经成为推动各行业智能决策的关键工具。从无人机监测农田到卫星数据支持气候研究&#xff0c;空天地遥感数据正以前所未有的方式为科研和商业带来深刻变革。然而&#xff0c;对于许多专业人士而言&#xff0c;如何高效地处…

STM32完全学习——外部中断

一、嵌套向量中断控制器 我们在这里使用标准库的方式来处理。因此只需要调用几个函数就可以了。 NVIC_InitTypeDef NVIC_InitStruct; NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1); //中断优先级分组 分1组NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0); …

【动手做】安装Miniconda和jupyter notebook环境实现线性回归

Miniconda提供快速、简便的Python环境管理&#xff0c;包括安装、运行和更新软件包及其依赖项。Jupyter Notebook是一个交互式笔记本&#xff0c;在机器学习研究中广泛使用。本文旨在进行基础的环境配置&#xff0c;为后续的机器学习实践打好基础。 Miniconda与Jupyter Notebo…

7-简单巡检

KES的版本与license有效期 简单而又会产生灾难性的问题 使用version函数查看KES版本信息 test# select version();查看license有效期 test# select get_license_validdays(); 服务器的时区和时间 查看KES服务器的时区 test# show timezone; test# show time_zone; #两者皆…

【金融风控项目-07】:业务规则挖掘案例

文章目录 1.规则挖掘简介2 规则挖掘案例2.1 案例背景2.2 规则挖掘流程2.3 特征衍生2.4 训练决策树模型2.5 利用结果划分分组 1.规则挖掘简介 两种常见的风险规避手段&#xff1a; AI模型规则 如何使用规则进行风控 **使用一系列逻辑判断(以往从职人员的经验)**对客户群体进行区…

RabbitMQ高可用

生产者确认 生产者确认就是&#xff1a;发送消息的人&#xff0c;要确保消息发送给了消息队列&#xff0c;分别是确保到了交换机&#xff0c;确保到了消息队列这两步。 1、在发送消息服务的application.yml中添加配置 spring:rabbitmq:publisher-confirm-type: correlated …

Redis的特性ubuntu进行安装

文章目录 1.六大特性1.1内存存储数据1.2可编程1.3可扩展1.4持久化1.5集群1.6高可用1.7速度快 2.具体应用场景&#xff08;了解&#xff09;3.Ubuntu安装Redis3.1安装指令3.2查看状态3.3查找配置文件3.4修改文件内容3.5重启服务器生效3.6安装客户端并进行检查 4.Redis客户端介绍…

本地音乐服务器(三)

6. 删除音乐模块设计 6.1 删除单个音乐 1. 请求响应设计 2. 开始实现 首先在musicmapper新增操作 Music findMusicById(int id);int deleteMusicById(int musicId); 其次新增相对应的.xml代码&#xff1a; <select id"findMusicById" resultType"com.exa…

leetcode【滑动窗口】相关题目分析讲解:leetcode209,leetcode904

经典滑动窗口(leetcode209) 题干 题目难度&#xff1a;简单 题目分析 要求找到符合大于等于target的长度最小的子数组的常规思路便是暴力破解——遍历数组&#xff0c;通过两层遍历&#xff0c;找到最小的子数组并返回。 但显而易见&#xff0c;这样时间复杂度会是O(n2)级…

ArkTS组件结构和状态管理

1. 认识基本的组件结构 ArkTS通过装饰器Component 和Entry 装饰 struct 关键字声明的数据结构&#xff0c;构成一个自定义组件 自定义组件中提供了一个build函数&#xff0c;开发者需要在函数内以链式调用的方式进行基本的UI描述&#xff0c;UI描述的方法请参考UI描述规范srtuc…

语义分割(semantic segmentation)

语义分割(semantic segmentation) 文章目录 语义分割(semantic segmentation)图像分割和实例分割代码实现 语义分割指将图片中的每个像素分类到对应的类别&#xff0c;语义区域的标注和预测是 像素级的&#xff0c;语义分割标注的像素级的边界框显然更加精细。应用&#xff1a…