C语言第十二课(下):操作符详解【逗号表达式、下标引用、函数调用、结构成员操作符与操作符属性】

news2024/9/24 3:18:02

目录

前言:

一、逗号表达式(exp1,exp2,exp3,...,expN):

二、下标引用、函数调用和结构成员[ ]、( )、. 、->:

        1.下标引用操作符[ ]:

        2.函数调用操作符( ):

        3.结构体成员访问操作符 . 、->:

        ①.结构体成员访问操作符 .:

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

三、操作符属性:

四、总结:


前言:

        前面我们对操作符进行了简单的分类:

算术操作符移位操作符位操作符
赋值操作符单目操作符关系操作符
逻辑操作符条件操作符逗号表达式
下标引用、函数调用和结构成员

        在上一篇文章中我们学习了单目、关系、逻辑与条件操作符的相关知识。本文我将继续按照顺序,带领小伙伴们一起学习操作符最后关于逗号表达式下标引用函数调用结构成员这些部分。

一、逗号表达式(exp1,exp2,exp3,...,expN):

        逗号表达式,就是用逗号隔开的多个表达式。

        各位小伙伴们一起来看看下面的代码,想一想它的最终结果会是什么,会如何在屏幕上进行打印呢:

#define _CRT_SECURE_NO_WARNINGS 1

#include<stdio.h>

int main()
{
	int a = 1;
	int b = 2;
	int c = (a > b, a = b + 10, a, b = a + 1);
	printf("变量 c 的值为:%d\n", c);
	return 0;
}

        答案是它会在我们的屏幕上打印出“变量 c 的值为:13”。那么变量c的值为什么会是13呢?逗号表达式又是如何作用的呢?

        逗号表达式的作用方式为:整个逗号表达式从左向右依次执行整个表达式的结果是最后一个表达式的结果

        即上述代码的执行流程为,首先判断a与b的大小,判断为假,但是判断后没有进行赋值变量a与变量b的值没有发生变化,继续向右执行;接着计算了b+10的值并将该值赋给了a,此时a的值变为12,继续向右执行;最后计算了b=a+1的值并将该值赋给了b,此时b的值变为了13;这时,整个逗号表达式内的各个表达式就执行结束了,而此时逗号表达式的最后一个表达式的结果为13,则将最后一个表达式的值13作为整个逗号表达式的结果赋给了c,所以在我们的屏幕上进行反馈打印时,打印出的变量c的值为13。

        逗号表达式也可用于分支、循环语句的条件判断中:

#define _CRT_SECURE_NO_WARNINGS 1

#include<stdio.h>

int main()
{
	int a = 5;
	int b = 3;
	int c = 1;
	int d = 0;
	int i = 10;
	for (i = 0; i < (i + 20, b = 1 - 5, a = b - 1, c = 3); i++)
	{
		if (a = b + 1, c = a / 2, d > 0)
		{
			printf("D > 0\n");
		}
		else
		{
			printf("D <= 0\n");
		}
	}
	return 0;
}

        这段代码中,首先进行循环条件判断中 i 的范围限制使用了逗号表达式,且逗号表达式从左向右依次执行后,最后一个表达式的结果为3,故整个逗号表达式的结果为3,也就是相当于与此时循环语句可以理解为:

for (i = 0; i < 3; i++);

        即整个循环语句将会循环执行三次。

        接着,在循环语句内部,分支语句的判断条件同样可以使用逗号表达式,逗号表达式的最后一个表达式为d>0,判断为假,即整个逗号表达式的判断结果为假,执行else语句。

        所以整段代码的执行结果为循环执行三次else打印

        那么逗号表达式有什么实际作用呢?我们来看下面这样的代码:

a = get_val();
count_val(a);
while( a > 0 )
{
    //业务处理
    a = get_val();
    count_val(a);
}

        这样的代码(假代码,仅研究形式不研究功能)理论上的功能是完备的,但是在书写方法上略显冗余,在需求功能更多时代码将会占用大量的空间,我们可以通过使用逗号表达式将其进行简化

while (a = get_val(), count_val(a), a > 0)
{
	//业务处理
}

        采用这样的形式,可以将原本冗杂的写法,改写的更为简洁,大幅度提高我们书写代码的效率

二、下标引用、函数调用和结构成员[ ]、( )、. 、->:

        1.下标引用操作符[ ]:

        下标引用操作符可是各位小伙伴们的老朋友了,这个操作符,在我们数组的学习和使用中可谓是符不离手了。它的使用没有什么难度,我们在这里简单对该操作符进行回顾即可。

        下标引用操作符的操作数有两个:一个数组名 + 一个索引值

#define _CRT_SECURE_NO_WARNINGS 1

#include<stdio.h>

int main()
{
	//创建数组:
	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
	//使用下标引用操作符数组元素:
	int b = arr[9];
    //操作符[ ]的两个操作数为:数组名arr和索引值9
	printf("arr[9]中存放的数据元素为:%d\n", b);
	return 0;
}

        在使用时,下标引用操作符表示从下标引用以操作符的操作数数组名为名的数组中,访问以其索引值为下标的数据元素。数组的下标从0开始,故下标为9的数据元素应当为数组中的第十个元素

        2.函数调用操作符( ):

        函数调用操作符我们同样也很熟悉,通过对函数的使用,可以使我们的程序各部分功能实现模块化开发,大幅度提升了我们代码的可读性与可移植性,并且便于我们通过一些手段对我们的功能代码实现隐藏。在这里我们也对其进行一个回顾即可:

#define _CRT_SECURE_NO_WARNINGS 1

#include<stdio.h>
//test1函数定义:
void test1()
{
	printf("Hi!\n");
}
//test2函数定义:
void test2(const char* str)
{
	printf("%s\n", str);
}

int main()
{
	test1();
    //调用函数test1
    //函数调用操作符的操作数可以是一个,此处为函数名test1
	test2("Thanks!");
    //调用函数test2
    //函数调用的操作数也可以是两个或多个,此处为函数名test2与函数参数字符串"Thanks!"
	return 0;
}

        即函数调用操作符的操作数可以是一个也可以是两个或多个第一个操作数为函数名剩余操作数为传递给函数的参数

        3.结构体成员访问操作符 . 、->:

        结构体我们目前还没有讲到,但对于当前操作符的讲解影响不大,且由于结构体部分的知识较为复杂,我将会在后面单独为各位小伙伴们进行讲解。此处我们只研究其中需要用到的两个成员访问操作符

        ①.结构体成员访问操作符 .:

#define _CRT_SECURE_NO_WARNINGS 1

#include<stdio.h>

//定义结构体Book:
struct Book
{
	//结构体成员1:字符串书名
	char name[20];
	//结构体成员2:字符串作者
	char author[30];
	//结构体成员3:整形价格
	int price;
};

int main()
{
	//结构体使用:struct+结构体名+结构体成员名={结构体成员属性}
	struct Book book1 = { "銮同学C语言","銮同学",0 }; 
	//结构体成员访问:结构体成员名.结构体成员属性
	printf("《 %s 》作者:%s 价格:%d\n", book1.name, book1.author, book1.price);

	return 0;
}

        它的编译运行结果:

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

#define _CRT_SECURE_NO_WARNINGS 1

#include<stdio.h>

//定义结构体Book:
struct Book
{
	//结构体成员1:字符串书名
	char name[20];
	//结构体成员2:字符串作者
	char author[30];
	//结构体成员3:整形价格
	int price;
};

void print(struct Book* p)
{
	//结构体成员访问:结构体成员名.结构体成员属性
	printf("《 %s 》作者:%s 价格:%d\n", (*p).name, (*p).author, (*p).price);
	//结构体成员访问:结构体指针->结构体成员属性
	printf("《 %s 》作者:%s 价格:%d\n", p->name, p->author, p->price);
}

int main()
{
	//结构体使用:struct+结构体名+结构体成员名={结构体成员属性}
	struct Book book1 = { "銮同学C语言","銮同学",0 }; 

	//结构体成员传址调用
	print(&book1);

	return 0;
}

        它的编译运行结果:

三、操作符属性:

        在复杂表达式中进行求值时,有三个影响因素:

        1.操作符的优先级

        2.操作符的结合性

        3.是否控制求值顺序

        即在执行求值计算时,两相邻操作符应当先执行哪一个?这个问题的答案是,取决于他们的优先级若优先级相同则取决于他们的结合性

表中操作符优先级从上到下依次减弱(lexp表示左表达式,rexp表示右表达式)
操作符描述用法示例结果类型结合性是否控制求值顺序
()聚组(表达式)与表达式相同N-A
()函数调用rexp(rexp,...);rexpL-R
[ ]下标引用rexp[rexp]lexpL-R
.访问结构成员lexp.member_namelexpL-R
->访问结构指针成员rexp->member_namelexpL-R
++后缀自增lexp++rexpL-R
--后缀自减lexp--rexpL-R
!逻辑反!rexprexpR-L
~按位取反~rexprexpR-L
+单目,表示正值+rexprexpR-L
-单目,表示负值-rexprexpR-L
++前缀自增++rexprexpR-L
--前缀自减--rexprexpR-L
*间接访问*rexplexpR-L
&取地址&lexprexpR-L
sizeof以字节计算长度sizeof rexp/(类型)rexpR-L
(类型)强制类型转换(类型)rexprexpR-L
*乘法rexp*rexprexpL-R
/除法rexp/rexprexpL-R
%整数求余rexp%rexprexpL-R
+加法rexp+rexprexpL-R
-减法rexp-rexprexpL-R
<<左移位rexp<<rexprexpL-R
>>右移位rexp>>rexprexpL-R
>大于rexp>rexprexpL-R
>=大于等于rexp>=rexprexpL-R
<小于rexp<rexprexpL-R
<=小于等于rexp<=rexprexpL-R
==等于rexp==rexprexpL-R
!=不等于rexp!=rexprexpL-R
&按位与rexp&rexprexpL-R
^按位异或rexp^rexprexpL-R
|按位或rexp|rexprexpL-R
&&逻辑与rexp&&rexprexpL-R

||

逻辑或rexp||rexprexpL-R
?:条件操作符rexp?rexp:rexprexpN-A
=赋值lexp=rexprexpR-L
+=以...加lexp+=rexprexpR-L
-=以...减lexp-=rexprexpR-L
*=以...乘lexp*=rexprexpR-L
/=以...除lexp/=rexprexpR-L
%=以...取模lexp%=rexprexpR-L
<<=以...左移lexp<<=rexprexpR-L
>>=以...右移lexp>>=rexprexpR-L
&=以...与lexp&=rexprexpR-L
^=以...异或lexp^=rexprexpR-L
|=以...或lexp|=rexprexpR-L
,逗号表达式rexp,rexprexpL-R

四、总结:

        到这里,关于字符串的知识的介绍就全部告一段落了,各位小伙伴们私下里应当尽可能的多去尝试,多去练习,从而巩固知识,磨练技术,达到真正提升个人代码书写能力的目的。

        希望各位小伙伴们能从加上今天的三篇关于字符串的应用详解中有所收获,同时能为各位小伙伴们的学习起到一些帮助我便也心满意足了。实力的来源不是胜利,唯有奋斗才能增强实力,当你历经苦难而不气馁,那就是实力!

        新人初来乍到,辛苦各位小伙伴们动动小手,三连走一走 ~ ~ ~  最后,本文仍有许多不足之处,欢迎各位看官老爷随时私信批评指正!

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

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

相关文章

Tomcat过时了?别多想,很多公司还是在用的。这份Tomcat架构详解,真的颠覆你的认知

Tomcat 不但没有过时&#xff0c;Spring Boot 还给 Tomcat 第二春了。 微服务的兴起&#xff0c;Tomcat 针对很多应用已经做成 embedded 模式了&#xff0c;Tomcat 本身是容器&#xff0c;Tomcat 的出现就是为了解决但是 EJB 和 Weblogic&#xff0c;JBoss 这种大而全的大象导致…

C++ OpenCV【视频合并:多个图像拼接在一张图像】

提示&#xff1a;本文中视频拼接指的是将多张图像按空间合并在一张图像上&#xff0c;而不是将多张图像按时间顺序拼接成一个多帧片段。 文章目录 前言 一、OpenCV知识点 1.OpenCV裁剪矩形区域赋值 2.OpenCV将Mat粘贴到指定位置 二、程序样例 1.程序源码 2.运行结果 前言 C版…

[附源码]Python计算机毕业设计Django姜太公渔具销售系统

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

看完这篇,还不懂JAVA内存模型(JMM)算我输

前言 开篇一个例子&#xff0c;我看看都有谁会&#xff1f;如果不会的&#xff0c;或者不知道原理的&#xff0c;还是老老实实看完这篇文章吧。 Slf4j(topic "c.VolatileTest") public class VolatileTest {static boolean run true;public static void main(Str…

一个简单的HTML网页 个人网站设计与实现 HTML+CSS+JavaScript自适应个人相册展示留言博客模板

&#x1f389;精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业…

Ubtunu排查磁盘空间是否已满—并清理的方式

项目场景&#xff1a; 最近使用nodejs开发的后端项目部署到Ubtunu服务器后接口无法访问了&#xff0c;接口也调用不通&#xff0c;NGINX报502错误。 问题描述 使用远程连接工具传文件也是无法上传&#xff0c;提示找不到文件&#xff0c;SCP命令也无法上传。 scp传文件报错&…

一文教会你如何在内网搭建一套属于自己小组的在线 API 文档?

Hello&#xff0c;大家好&#xff0c;我是阿粉&#xff0c;对接文档是每个开发人员不可避免都要写的&#xff0c;友好的文档可以大大的提升工作效率。 阿粉最近将项目的文档基于 Gitbook 和 Gitlab 的 Webhook 功能的在内网部署了一套实时的&#xff0c;使用起来特方便了。跟着…

第二证券|11月十大牛股出炉 特一药业163%涨幅问鼎榜首

到11月30日收盘&#xff0c;11月份十大牛股中7只个股涨幅超过100%&#xff0c;涨幅最小的也有87%&#xff0c;均匀涨幅较上个月有所扩大。 11月&#xff0c;A股出现震荡爬高态势&#xff0c;到11月30日收盘&#xff0c;上证指数月内涨8.91%&#xff0c;深证成指涨6.84%&#xf…

大学生HTML作业节日网页 HTML作业节日文化网页期末作业 html+css+js节日网页 HTML学生节日介绍 HTML学生作业网页视频

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

基于STM32单片机的温湿度检测报警器(数码管)(Proteus仿真+程序)

编号&#xff1a;27 基于STM32单片机的温湿度检测报警器&#xff08;数码管&#xff09; 功能描述&#xff1a; 本设计由STM32F103单片机最小系统DHT11温湿度传感器数码管显示模块声光报警模块独立按键组成。 1、主控制器是STM32F103单片机 2、DHT11传感器测量温度和湿度数据…

Android注解快速入门和实用解析

首先什么是注解&#xff1f;Override就是注解&#xff0c;它的作用是&#xff1a; 1、检查是否正确的重写了父类中的方法。2、标明代码&#xff0c;这是一个重写的方法。1、体现在于&#xff1a;检查子类重写的方法名与参数类型是否正确&#xff1b;检查方法private&#xff0f…

带你走进知识图谱的世界

知识图谱知识图谱的介绍01 什么是知识图谱02 知识图谱构建的关键技术03 知识图谱的存储04 知识图谱在金融领域的应用图数据库 Neo4j知识图谱的介绍 知识图谱最开始是Google为了优化搜索引擎提出来的&#xff0c;推出之后引起了业界轰动&#xff0c;随后其他搜索公司也纷纷推出…

[附源码]计算机毕业设计医疗器械公司公告管理系统Springboot程序

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

MXNet中im2rec将图片转换成二进制RecordIO格式

我们在前面的 计算机视觉之目标检测训练数据集&#xff08;皮卡丘&#xff09;《2》其中有提到这个二进制的RecordIO格式&#xff0c;使用的是MXNet自带的im2rec工具&#xff0c;源码在tools里面 import mxnet as mx #D:\Anaconda3\envs\myd2l\lib\site-packages\mxnet\tools\…

农大毕业7年后,转行软件测试,我拿到了一块结实的敲门砖

“经过这段时间的学习&#xff0c;让我摸清了这个行业的游戏规则&#xff0c;可以说是让我拿到了一块结实的敲门砖。” 今天跟大家分享的是近期就业的学员刘同学的转行故事&#xff0c;希望他的经历能给同样在向梦想奔跑的你一些帮助。 毕业7年后&#xff0c;从网信办主任转行…

基于STM32单片机的直流电机PWM调速(数码管显示)(Proteus仿真+程序)

编号&#xff1a;24 基于STM32单片机的直流电机PWM调速 功能描述&#xff1a; 由 STM32单片机数码管显示模块键盘模块L298N电机驱动模块直流电机 1、采用STM32F103单片机为主控制器 2、四个按键&#xff0c;分别为启动/暂停、方向切换、加速、减速功能 3、数码管显示PWM占空比…

[附源码]计算机毕业设计演唱会门票售卖系统Springboot程序

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

SMART PLC高速脉冲输出如何断电保持当前位置

S7-200 SMART PLC脉冲轴控制相关的内容,可以参看下面的博客: S7-200 SMART PLC自定义脉冲轴控功能块AxisControl_FB(梯形图)_RXXW_Dor的博客-CSDN博客博途1200/1500PLC的相关总线轴PN总线控制可以参考相关专栏的博客,链接地址如下:博途PLC 1200/1500PLC轴控功能块Servo_A…

[附源码]Python计算机毕业设计Django基于Vuejs的中国名茶销售平台

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

历史名人鲁迅介绍HTML个人网页作业作品下载 历史人物介绍网页设计制作 大学生英雄人物网站作业模板 dreamweaver简单个人网页制作

&#x1f389;精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业…