C语言:操作符详解(下)
目录
- 一、逗号表达式
- 二、下标访问[ ]、函数调用()
- 1. [ ]下标引用操作符
- 2.函数调用操作符
- 三、结构成员访问操作符
- 1.结构体
- (1) 结构的声明
- (2) 结构体变量的定义和初始化
- 2.结构成员访问操作符
- (1)结构体成员的直接访问
- (2)结构体成员的间接访问
- 四、操作符的属性:优先级、结合性
- 1.优先级
- 2.结合性
- 五、表达式求值
- 1.整型提升
- 2.算术转换
一、逗号表达式
exp1, exp2, exp3, …expN
逗号表达式,就是用逗号隔开的多个表达式。
逗号表达式,从左向右依次执行,整个表达式的结果是最后⼀个表达式的结果。
//代码1
int a = 1;
int b = 2;
int c = (a>b, a=b+10, a, b=a+1); //逗号表达式
c是多少?
聪明的你此时心里一定已经有答案了趴!😎没错,就是13。
二、下标访问[ ]、函数调用()
1. [ ]下标引用操作符
操作数:一个数组名 + 一个索引值
int arr[10]; //创建数组
arr[9] = 10; //使⽤下标引⽤操作符。
[ ]的两个操作数是arr和9。
2.函数调用操作符
接受一个或者多个操作数:第一个操作数是函数名,剩余的操作数就是传递给函数的参数。
#include <stdio.h>
void test1()
{printf("hehe\n");
}
void test2(const char *str)
{printf("%s\n", str);
}
int main()
{test1(); //这⾥的()就是作为函数调⽤操作符。test2("hello bit."); //这⾥的()就是函数调⽤操作符。return 0;
}
三、结构成员访问操作符
1.结构体
C语言已经提供了内置类型,如:char、short、int、long、float、double等,但是只有这些内置类型还是不够的,假设我想描述学生,描述一本书,这时单一的内置类型是不行的。描述一个学生需要名字、年龄、学号、身高、体重等;描述一本书需要作者、出版社、定价等。C语言为了解决这个问题,增加了结构体这种自定义的数据类型,让程序员可以自己创造适合的类型。
📌 结构是一些值的集合,这些值称为成员变量。结构的每个成员可以是不同类型的变量,如:标量、数组、指针,甚至是其他结构体。
(1) 结构的声明
struct tag
{
member-list;
}variable-list;
描述一个学生:
struct Stu
{char name[20]; //名字int age; //年龄char sex[5]; //性别char id[20]; //学号
}; //分号不能丢
(2) 结构体变量的定义和初始化
//代码1:变量的定义
struct Point
{int x;int y;
}p1; //声明类型的同时定义变量p1
struct Point p2; //定义结构体变量p2//代码2:初始化。
struct Point p3 = {10, 20};
struct Stu //类型声明
{char name[15]; //名字int age; //年龄
};struct Stu s1 = {"zhangsan", 20}; //初始化
struct Stu s2 = {.age=20, .name="lisi"}; //指定顺序初始化//代码3
struct Node
{int data;struct Point p;struct Node* next;
}n1 = {10, {4,5}, NULL}; //结构体嵌套初始化struct Node n2 = {20, {5, 6}, NULL}; //结构体嵌套初始化
2.结构成员访问操作符
(1)结构体成员的直接访问
结构体成员的直接访问是通过点操作符(.)访问的。点操作符接受两个操作数。如下所示:
#include <stdio.h>
struct Point
{int x;int y;
}p = {1,2};
int main()
{printf("x: %d y: %d\n", p.x, p.y);return 0;
}
使用方式: 结构体变量.成员名
(2)结构体成员的间接访问
有时候我们得到的不是一个结构体变量,而是得到了一个指向结构体的指针。如下所示:
#include <stdio.h>
struct Point
{int x;int y;
};
int main()
{struct Point p = {3, 4};struct Point *ptr = &p;ptr->x = 10;ptr->y = 20;printf("x = %d y = %d\n", ptr->x, ptr->y);return 0;
}
使用方式: 结构体指针->成员名
综合举例:
#include <stdio.h>
#include <string.h>struct Stu
{char name[15]; //名字int age; //年龄
};void print_stu(struct Stu s)
{printf("%s %d\n", s.name, s.age);
}void set_stu(struct Stu* ps)
{strcpy(ps->name, "李四");ps->age = 28;
}int main()
{struct Stu s = { "张三", 20 };print_stu(s);set_stu(&s);print_stu(s);return 0;
}

四、操作符的属性:优先级、结合性
C语言的操作符有2个重要的属性:优先级、结合性,这两个属性决定了表达式求值的计算顺序。
1.优先级
优先级指的是,如果一个表达式包含多个运算符,哪个运算符应该优先执行。各种运算符的优先级是不⼀样的。
3 + 4 * 5;
上面示例中,表达式 3 + 4 * 5 里面既有加法运算符( + ),又有乘法运算符( * )。由于乘法的优先级高于加法,所以会先计算 4 * 5 ,而不是先计算 3 + 4 。
2.结合性
如果两个运算符优先级相同,优先级没办法确定先计算哪个了,这时候就看结合性了,则根据运算符是左结合,还是右结合,决定执行顺序。大部分运算符是左结合(从左到右执⾏),少数运算符是右结合(从右到左执行),比如赋值运算符( = )。
5 * 6 / 2;
上面示例中, * 和 / 的优先级相同,它们都是左结合运算符,所以从左到右执行,先计算 5 * 6 ,再计算 6 / 2 。
运算符的优先级顺序很多,下面是部分运算符的优先级顺序(按照优先级从高到低排列),建议大概记住这些操作符的优先级就行,其他操作符在使用的时候查看下面链接就可以了。
- 圆括号(
())- ⾃增运算符(
++),⾃减运算符(--)- 单⽬运算符(
+和-)- 乘法(
*),除法(/)- 加法(
+),减法(-)- 关系运算符(
<、>等)- 赋值运算符(
=)
由于圆括号的优先级最高,可以使用它改变其他运算符的优先级。
这里是所有的C运算符优先级表:https://zh.cppreference.com/w/c/language/operator_precedence
五、表达式求值
1.整型提升
C语言中整型算术运算总是至少以整型类型的精度来进行的。
为了获得这个精度,表达式中的字符和短整型操作数在使⽤之前被转换为普通整型,这种转换称为整型提升。
整型提升的意义:
表达式的整型运算要在CPU的相应运算器件内执行,CPU内整型运算器(ALU)的操作数的字节长度一般就是int的字节长度,同时也是CPU的通用寄存器的长度。
因此,即使两个char类型的相加,在CPU执行时实际上也要先转换为CPU内整型操作数的标准长度。
通用CPU(general-purposeCPU)是难以直接实现两个8比特字节直接相加运算(虽然机器指令中可能有这种字节相加指令)。所以,表达式中各种长度可能小于int长度的整型值,都必须先转换为int或unsigned int,然后才能送入CPU去执行运算。
//实例1
char a,b,c;
...
a = b + c;
b和c的值被提升为普通整型,然后再执行加法运算。
加法运算完成之后,结果将被截断,然后再存储于a中。
如何进行整体提升呢?
1.有符号整数提升是按照变量的数据类型的符号位来提升的
2.⽆符号整数提升,高位补0
//负数的整形提升
char c1 = -1;
变量c1的⼆进制位(补码)中只有8个⽐特位:
1111111
因为 char 为有符号的 char
所以整形提升的时候,⾼位补充符号位,即为1
提升之后的结果是:
11111111111111111111111111111111//正数的整形提升
char c2 = 1;
变量c2的⼆进制位(补码)中只有8个⽐特位:
00000001
因为 char 为有符号的 char
所以整形提升的时候,⾼位补充符号位,即为0
提升之后的结果是:
00000000000000000000000000000001
2.算术转换
如果某个操作符的各个操作数属于不同的类型,那么除非其中一个操作数转换为另⼀个操作数的类型,否则操作就无法进行。下⾯的层次体系称为寻常算术转换。
long double
double
float
unsigned long int
long int
unsigned int
int
如果某个操作数的类型在上面这个列表中排名靠后,那么首先要转换为另外一个操作数的类型后执行运算。
总结: 即使有了操作符的优先级和结合性,我们写出的表达式依然有可能不能通过操作符的属性确定唯一的计算路径,那这个表达式就是存在潜在风险的,建议不要写出特别复杂的表达式。
操作符详解就此完结,感谢各位的支持和点赞,下期见哟!💖
相关文章:
C语言:操作符详解(下)
目录 一、逗号表达式二、下标访问[ ]、函数调用()1. [ ]下标引用操作符2.函数调用操作符 三、结构成员访问操作符1.结构体(1) 结构的声明(2) 结构体变量的定义和初始化 2.结构成员访问操作符(1)结构体成员的直接访问(2)结构体成员的间接访问 四、操作符的属性:优先级…...
电商场景下 ES 搜索引擎的稳定性治理实践
继上文在完成了第一阶段 ES 搜索引擎的搭建后,已经能够实现对千万级别的商品索引的读写请求的支持。目前,单机房读流量在 500~1000 QPS 之间,写流量在 500 QPS 左右。 但随着业务的发展,问题也逐渐开始暴露࿰…...
jdk8与jdk17的区别。springboot2.x与springboot3.x的区别
1. jdk8与jdk17的区别 Java JDK 8 和 JDK 17 之间存在许多区别,包括功能、性能、语言特性和工具等方面。以下是它们之间的一些主要区别: 功能和语言特性: JDK 8引入了许多重要的语言特性,包括Lambda表达式、方法引用、Stream API、…...
Pytest测试中的临时目录与文件管理!
在Pytest测试框架中,使用临时目录与文件是一种有效的测试管理方式,它能够确保测试的独立性和可重复性。在本文中,我们将深入探讨如何在Pytest中利用临时目录与文件进行测试,并通过案例演示实际应用。 为什么需要临时目录与文件&a…...
arduino 编程esp8266
概述: 1.板子外设资源的访问:Libraries - Arduino Reference 注意:开发板未nodeMCU1.0(esp-12e)(esp8266-01s上调试的。) 2.硬件接线 en,vcc接3.3v,gnd接地(也就是和串口共地),gpio1接地。tx接串口rx,rx接串…...
基于springboot实现数据资产管理系统项目【项目源码+论文说明】计算机毕业设计
基于springboot实现数据资产管理系统演示 摘要 固定资产管理系统主要是完成对系统用户管理、资产信息管理、资产变更管理、资产用途管理、资产类别管理和资产增减管理。因为利用本系统管理员可以直接录入信息,修改信息,删除信息,并且若在录入…...
在Java中如何将十进制转换为二进制,八进制,十六进制以及它们之间的互相转换
目录 一、算法实现进制之间的转换 (1)十进制转换为二进制 (2)二进制转换成十进制 二、Java中的API实现进制转换 (1)十进制转换为二进制 (2)十进制转换为八进制 (3…...
AK/SK加密认证
一、AK/SK概念 Access Key (AK):AK是一个全局唯一的字符串标识符,用于标识用户。它类似于用户名,但仅用于身份识别,并不包含任何秘密信息。 Secret Access Key (SK):SK则是一个高度保密的密钥,类似于密码&…...
前端实现websocket通信讲解(vue2框架)
websocket: WebSocket是HTML5下一种新的协议(websocket协议本质上是一个基于tcp的协议)它实现了浏览器与服务器全双工通信,能更好的节省服务器资源和带宽并达到实时通讯的目的Websocket是一个持久化的协议 websocket提供的api&a…...
解决ffmpeg播放摄像头延时的问题(项目案例使用有效)
第一1.目前使用的对接的海康威视的摄像机,并且采用的流媒体服务器NodeMediaServer 进行收数据流并发流数据。但是延时达到了20秒,所以客户看到的效果不是很乐观,没有办法,只能开始优化播放延时的问题,至于对接摄像头的方案有好几种。我这种情况是时间没有延迟只有画面是有…...
Android 音频系统
导入 早期Linux版本采用的是OSS框架,它也是Unix及类Unix系统中广泛使用的一种音频体系。 ALSA是Linux社区为了取代OSS而提出的一种框架,是一个源代码完全开放的系统(遵循GNU GPL和GNU LGPL)。ALSA在Kernel 2.5版本中被正式引入后,OSS就逐步…...
Java必须掌握的二叉堆知识点(含面试大厂题含源码)
二叉堆是一种常用的优先队列数据结构,广泛应用于各种场景,比如任务调度、带权图的最短路径算法(如Dijkstra算法)等。在Java面试中,了解二叉堆的基本概念、实现方式和操作是非常重要的。下面是一些关于二叉堆的关键知识…...
[Java、Android面试]_03_java内存管理:虚拟内存、堆、垃圾回收
本人今年参加了很多面试,也有幸拿到了一些大厂的offer,整理了众多面试资料,后续还会分享众多面试资料,感兴趣的朋友可收藏关注, 现分享如下: 文章目录 1. Java虚拟机运行时数据区2. Java堆3. 垃圾回收3.1 如…...
PTA题解 --- 求整数段和(C语言)
今天是PTA题库解法讲解的第二天,接下来讲解求整数段和,题目如下: 为了解决这个问题,你可以遵循以下的思路: 1. 读取输入的两个整数A和B。 2. 使用一个for循环,从A遍历到B。 3. 在循环中,打印当…...
virsh管理虚拟机的命令行工具
virsh是一个管理虚拟机的命令行工具,提供了丰富的命令来查看、创建、管理虚拟机。以下是一些常用的virsh命令: 查看帮助和版本: virsh --help:查看virsh命令的帮助信息。virsh -version:查看virsh的版本信息。 查看虚…...
数据集成平台选型建议
一 数据集成介绍 数据集成平台是一种用于管理和协调数据流动的软件工具或服务。它的主要目标是将来自多个不同数据源的数据整合到一个统一的、易于访问和分析的数据存储库中。这些数据源可以包括数据库、云应用、传感器、日志文件、社交媒体等等。数据集成平台的关键任务是确保…...
Centos8安装Docker,使用阿里云源
一、前期准备 1.关闭防火墙,SELINUX systemctl stop firewalld.service systemctl disable firewalld.service setenforce 0 sed -i "s/SELINUXenforcing/SELINUXdisabled/g" /etc/selinux/config查看状态 systemctl status firewalld systemctl status…...
FFmpeg概念和简单使用
FFmpeg是一个开源的跨平台多媒体处理工具套件,包含了用于处理音频、视频和图像的各种工具、库和命令行程序。它由一个主要的命令行工具ffmpeg和一系列相关工具组成,可以执行各种各样的多媒体操作。以下是FFmpeg中一些重要的概念: 音频、视频和…...
OJ_最长公共子序列
题干 C实现 #include <iostream> #include <stdio.h> #include <algorithm> using namespace std;int dp[1002][1002];int main() {int n,m;char s1[1001];char s2[1001];scanf("%d%d",&n,&m);scanf("%s%s",s1,s2);//dp[i][j]是…...
SpringBoot拦截器获取token用户对象优雅地传递到Controller层
项目场景: SpringBoot拦截器获取token用户对象优雅地传递到Controller层 问题描述 后端有许多接口都需要请求中携带有正确的Token,这时采用拦截器来验证token,但是每个接口都还是需要解析一遍token,浪费资源,不免显得…...
告别Bowtie2!用Minimap2搞定FASTQ到BAM的保姆级流程(含最新参数详解)
告别Bowtie2!用Minimap2搞定FASTQ到BAM的保姆级流程(含最新参数详解) 在生物信息学领域,测序数据的比对分析一直是核心工作流程之一。随着测序技术的快速发展,传统的比对工具如Bowtie2在处理长读长测序数据时逐渐显现出…...
Postman接口测试实战:48小时掌握状态码、JSON与断言
1. 这不是又一篇“点点点就完事”的接口测试入门“接口测试小白入门”——光是看到这七个字,我手边的咖啡杯就晃了三下。过去三年,我带过27个刚转行进测试岗的新人,其中21个在入职第一周就卡在“Postman怎么发请求”这一步;还有4个…...
视频硬字幕提取革命:87种语言本地OCR识别,让字幕提取从未如此简单
视频硬字幕提取革命:87种语言本地OCR识别,让字幕提取从未如此简单 【免费下载链接】video-subtitle-extractor 视频硬字幕提取,生成srt文件。无需申请第三方API,本地实现文本识别。基于深度学习的视频字幕提取框架,包含…...
Triangle Splatting:3D渲染中几何精度与效率的平衡技术
1. Triangle Splatting技术概述在实时3D渲染领域,渲染效率与视觉质量的平衡一直是核心挑战。传统三角形光栅化虽然硬件友好,但难以实现柔和的边缘效果;而基于点的渲染技术(如Gaussian Splatting)虽能产生自然过渡&…...
AI Agent金融应用的“黑箱困局”:模型可解释性不达标=监管否决权!3种通过FINRA/证监会双认证的XAI实施方案
更多请点击: https://kaifayun.com 第一章:AI Agent金融应用的“黑箱困局”:模型可解释性不达标监管否决权!3种通过FINRA/证监会双认证的XAI实施方案 当AI Agent在信贷审批、反洗钱(AML)实时监控或智能投顾…...
Balena Etcher:3步搞定镜像烧录,告别传统工具烦恼
Balena Etcher:3步搞定镜像烧录,告别传统工具烦恼 【免费下载链接】etcher Flash OS images to SD cards & USB drives, safely and easily. 项目地址: https://gitcode.com/GitHub_Trending/et/etcher 你是否曾为制作启动盘而烦恼࿱…...
选RFID仓储管理系统厂家别只盯着参数!老采购教你用场景思维找到真正靠谱的供应商
很多企业在选型RFID仓储管理系统时,第一反应是翻遍全网找“RFID智能仓储管理系统厂家有哪些”,然后把七八家供应商的参数表摊在桌上逐一对比。读取速度多少、识别距离多远、支持多少标签同时读取——这些指标当然重要,但如果你的选型逻辑仅停…...
SQL 语句:从产生、发展到内容全景
引言:数据世界的通用语言 SQL(Structured Query Language,结构化查询语言)是当今数据领域最核心、最通用的语言。无论是数据分析师、后端工程师还是数据科学家,都离不开 SQL。它就像数据世界的“普通话”,连…...
MyBatis-Plus持久层框架应用技术研究
在Web应用系统开发过程中,数据持久层承担着数据库交互、数据读写、数据统计、条件查询的核心作用,持久层框架的性能与便捷性直接决定项目开发效率与系统运行稳定性。传统MyBatis框架虽能够实现数据库增删改查操作,但存在代码冗余、重复代码多…...
NotebookLM移动端体验全拆解(iOS/Android双端对比报告·仅限内测用户知晓的性能阈值)
更多请点击: https://kaifayun.com 第一章:NotebookLM移动端体验全景概览 NotebookLM 作为 Google 推出的基于用户自有文档构建的 AI 助手,其移动端(iOS/Android)已正式开放下载。该应用并非简单将网页版界面缩放适配…...
