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

news2024/11/23 17:14:14

目录

前言:

一、逗号表达式(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/66712.html

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

相关文章

NoSQL之Redis配置与优化

目录 一、redis简介 1、redis的优点 2、redis的缺点 3、redis应用场景 4、redis为什么这么快 5、redis与memcached比较 二、关系数据库与非关系型数据 1、关系型数据库 2、非关系型数据库 3、关系型数据库和非关系型数据库区别 三、redis安装部署 四、redis命令工具…

一套完整的养老院人员定位解决方案包含哪些内容?

养老院人员定位解决方案是建立面向社区及养老组织的传感网系统与信息渠道&#xff0c;并在此基础上提供实时、方便、高效、低成本的、物联化、互联化、智能化的养老服务。 人口老龄化问题早已成为当今社会关注的重要问题之一。在养老院封闭的环境&#xff0c;养老院希望利用智能…

解放程序员双手——ChatGPT安装踩雷之路+使用体验

&#x1f34a;作者简介&#xff1a;秃头小苏&#xff0c;致力于用最通俗的语言描述问题 &#x1f34a;专栏推荐&#xff1a;深度学习网络原理与实战 &#x1f34a;近期目标&#xff1a;写好专栏的每一篇文章 &#x1f34a;支持小苏&#xff1a;点赞&#x1f44d;&#x1f3fc;、…

数据之道读书笔记-10未来已来:数据成为企业核心竞争力

数据之道读书笔记-10未来已来&#xff1a;数据成为企业核心竞争力 数字化转型不能一蹴而就&#xff0c;数据治理也不是一朝一夕之功。数字化转型带来机遇的同时&#xff0c;也给整个企业的数据治理带来了新的挑战。 基于对华为公司数字化转型的解读&#xff0c;我们建立了数据…

Win11的两个实用技巧系列之查看所有用户帐户、应用冻结

目录 如何在Win11上查看所有用户帐户?Win11上查看所有用户帐户四种方法 方法一&#xff1a;在 Windows 11 的“设置”中检查所有帐户 方法二&#xff1a;在 Windows 11 的计算机管理中检查所有帐户 方法三&#xff1a;在 Windows 11 上通过命令提示符检查所有帐户 方法四&am…

【微信小程序】商品管理-微信小程序项目开发入门

有个人家开店&#xff0c;店里商品堆积越来越多&#xff0c;多了就不好管理了&#xff0c;那有没有想过需要类似于商品管理的一套小程序呢&#xff0c;这里给大家提供一个容易上手的商品管理微信小程序解决方案&#xff0c;非常适合新手学习入门。 先说明一下这里讲得是一个微信…

《python 数据可视化基础》第三章 散点图 scatter

第三章 散点图 scatter 参考自官方文档&#xff1a;https://matplotlib.org/stable/api/_as_gen/matplotlib.axes.Axes.scatter.html#matplotlib.axes.Axes.scatter matplotblib 绘制散点图常用参数&#xff1a; x, y&#xff1a;一个或者多个点的位置&#xff1b;s&#xff1…

Halcon快速入门

前言一&#xff0c;HALCON 概述1.1&#xff0c;HALCON 安装二&#xff0c;HALCON 架构 2.1&#xff0c;算子 2.1.1&#xff0c;参数和数据结构 2.2&#xff0c;拓展包2.3&#xff0c;接口 2.3.1&#xff0c;HALCON-Python 接口2.3.2&#xff0c;HALCON-C 接口2.3.3&#xff0c;…

[附源码]Python计算机毕业设计SSM家政服务预约小程序(程序+LW)

项目运行 环境配置&#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…

开源版商城源码V2.0【小程序 + H5+ 公众号 + APP】

内容目录一、详细介绍二、效果展示1.部分代码2.效果图展示三、学习资料下载一、详细介绍 这是一款轻量级、高性能、前后端分离的电商系统&#xff0c;&#xff0c;支持微信小程序 H5 公众号 APP&#xff0c;前后端源码完全开源&#xff0c;看见及所得&#xff0c;完美支持二…

[附源码]Python计算机毕业设计SSM家政服务管理系统(程序+LW)

项目运行 环境配置&#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…

vue中的h函数与JSX语法

vue不仅像react一样实现了jsx&#xff0c;而且还借助jsx发挥了javascript动态画的优势&#xff0c;了解学习jsx可以让你更灵活的开发需求。 一、 h函数 在聊vue中的JSX之前&#xff0c;需要简单介绍一下 h 函数&#xff0c;理解了 h 函数&#xff0c;会更好的理解JSX。 1.h函…

[附源码]计算机毕业设计基于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…

WebLogic JVM Core dumps文件的生成控制

一&#xff0c;背景 当我们运行的WebLogic JVM发生Fatal Error时&#xff0c;会造成JVM crash掉&#xff0c;进而造成进程终止。一般来说crash的时间我们是无法估计在什么时候的&#xff0c;它具有很大的偶然性&#xff0c;因此理论上有时我们希望自动产生Core dump文件来提供…

figma有哪些快速入门的好用技巧

使用Figma在创建设计系统或处理大型设计项目时&#xff0c;总会涉及批量修改.快速定位.自动布局问题&#xff0c;MarcAndrew这篇文章分享了技巧&#xff0c;可以大大提高设计效率&#xff0c;希望对大家有所帮助: 在这篇文章中&#xff0c;我列出了一些快速简单的方法来帮助你…

YoLo V3 SPP u模型的讲解与总结

一。mosaic图像增强 其实就是将多张图片给汇总到一起&#xff0c;在源码当中就是默认使用4张图片进行拼接&#xff0c;进行预测。 优点&#xff1a; 增加数据的多样性增加目标个数BN能一次性统计多张图片的参数&#xff08;变相的增加了&#xff0c;输入一张图片其实就已经包…

Java agent 使用详解

一、前言 于一个即将上线的应用来说&#xff0c;系统监控是必不可少的&#xff0c;为什么需要监控呢&#xff1f;应用是跑在服务器上的&#xff0c;应用在运行过程中会发生各自意想不到的问题&#xff0c;像大家熟知的OOM&#xff0c;mysql故障&#xff0c;服务器宕机&#xff…

Mac docker-desktop 安装单机版k8s

文章目录01 引言02 下载安装docker desktop03 安装k8s04 安装k8s控制台&#xff08;k8s dashboard&#xff09;05 更方遍的方式安装dashboard01 引言 本文主要讲解在Mac下使用docker-desktop来安装k8s。 02 下载安装docker desktop 下载地址&#xff1a;https://www.docker.…

实例方法定义语法(四)

那么什么是方法呢&#xff1f; Java方法是语句的集合&#xff0c;它们在一起执行一个功能。 方法是解决一类问题的步骤的有序组合 方法包含于类或对象中 方法在程序中被创建&#xff0c;在其他地方被引用 1.方法的定义 类的方法定义类的某种行为或者功能。 方法定义的语法…

Allegro如何设置丝印位号优先显示操作指导

Allegro如何设置丝印位号优先显示操作指导 Allegro支持让丝印位号优先显示,可以让视图更加的清晰明了,按照需要的方式显示,具体操作如下 以下图为例 丝印位号被器件的外形盖住了,需要显示的效果为,优先显示丝印位号,器件外形次优先 选择display-layer Priority 出现Di…