当前位置: 首页 > news >正文

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)结构体成员的间接访问 四、操作符的属性&#xff1a;优先级…...

电商场景下 ES 搜索引擎的稳定性治理实践

继上文在完成了第一阶段 ES 搜索引擎的搭建后&#xff0c;已经能够实现对千万级别的商品索引的读写请求的支持。目前&#xff0c;单机房读流量在 500&#xff5e;1000 QPS 之间&#xff0c;写流量在 500 QPS 左右。 但随着业务的发展&#xff0c;问题也逐渐开始暴露&#xff0…...

jdk8与jdk17的区别。springboot2.x与springboot3.x的区别

1. jdk8与jdk17的区别 Java JDK 8 和 JDK 17 之间存在许多区别&#xff0c;包括功能、性能、语言特性和工具等方面。以下是它们之间的一些主要区别&#xff1a; 功能和语言特性&#xff1a; JDK 8引入了许多重要的语言特性&#xff0c;包括Lambda表达式、方法引用、Stream API、…...

Pytest测试中的临时目录与文件管理!

在Pytest测试框架中&#xff0c;使用临时目录与文件是一种有效的测试管理方式&#xff0c;它能够确保测试的独立性和可重复性。在本文中&#xff0c;我们将深入探讨如何在Pytest中利用临时目录与文件进行测试&#xff0c;并通过案例演示实际应用。 为什么需要临时目录与文件&a…...

arduino 编程esp8266

概述&#xff1a; 1.板子外设资源的访问&#xff1a;Libraries - Arduino Reference 注意&#xff1a;开发板未nodeMCU1.0(esp-12e)(esp8266-01s上调试的。) 2.硬件接线 en,vcc接3.3v,gnd接地&#xff08;也就是和串口共地&#xff09;&#xff0c;gpio1接地。tx接串口rx,rx接串…...

基于springboot实现数据资产管理系统项目【项目源码+论文说明】计算机毕业设计

基于springboot实现数据资产管理系统演示 摘要 固定资产管理系统主要是完成对系统用户管理、资产信息管理、资产变更管理、资产用途管理、资产类别管理和资产增减管理。因为利用本系统管理员可以直接录入信息&#xff0c;修改信息&#xff0c;删除信息&#xff0c;并且若在录入…...

在Java中如何将十进制转换为二进制,八进制,十六进制以及它们之间的互相转换

目录 一、算法实现进制之间的转换 &#xff08;1&#xff09;十进制转换为二进制 &#xff08;2&#xff09;二进制转换成十进制 二、Java中的API实现进制转换 &#xff08;1&#xff09;十进制转换为二进制 &#xff08;2&#xff09;十进制转换为八进制 &#xff08;3…...

AK/SK加密认证

一、AK/SK概念 Access Key (AK)&#xff1a;AK是一个全局唯一的字符串标识符&#xff0c;用于标识用户。它类似于用户名&#xff0c;但仅用于身份识别&#xff0c;并不包含任何秘密信息。 Secret Access Key (SK)&#xff1a;SK则是一个高度保密的密钥&#xff0c;类似于密码&…...

前端实现websocket通信讲解(vue2框架)

websocket&#xff1a; WebSocket是HTML5下一种新的协议&#xff08;websocket协议本质上是一个基于tcp的协议&#xff09;它实现了浏览器与服务器全双工通信&#xff0c;能更好的节省服务器资源和带宽并达到实时通讯的目的Websocket是一个持久化的协议 websocket提供的api&a…...

解决ffmpeg播放摄像头延时的问题(项目案例使用有效)

第一1.目前使用的对接的海康威视的摄像机,并且采用的流媒体服务器NodeMediaServer 进行收数据流并发流数据。但是延时达到了20秒,所以客户看到的效果不是很乐观,没有办法,只能开始优化播放延时的问题,至于对接摄像头的方案有好几种。我这种情况是时间没有延迟只有画面是有…...

Android 音频系统

导入 早期Linux版本采用的是OSS框架&#xff0c;它也是Unix及类Unix系统中广泛使用的一种音频体系。 ALSA是Linux社区为了取代OSS而提出的一种框架&#xff0c;是一个源代码完全开放的系统(遵循GNU GPL和GNU LGPL)。ALSA在Kernel 2.5版本中被正式引入后&#xff0c;OSS就逐步…...

Java必须掌握的二叉堆知识点(含面试大厂题含源码)

二叉堆是一种常用的优先队列数据结构&#xff0c;广泛应用于各种场景&#xff0c;比如任务调度、带权图的最短路径算法&#xff08;如Dijkstra算法&#xff09;等。在Java面试中&#xff0c;了解二叉堆的基本概念、实现方式和操作是非常重要的。下面是一些关于二叉堆的关键知识…...

[Java、Android面试]_03_java内存管理:虚拟内存、堆、垃圾回收

本人今年参加了很多面试&#xff0c;也有幸拿到了一些大厂的offer&#xff0c;整理了众多面试资料&#xff0c;后续还会分享众多面试资料&#xff0c;感兴趣的朋友可收藏关注&#xff0c; 现分享如下&#xff1a; 文章目录 1. Java虚拟机运行时数据区2. Java堆3. 垃圾回收3.1 如…...

PTA题解 --- 求整数段和(C语言)

今天是PTA题库解法讲解的第二天&#xff0c;接下来讲解求整数段和&#xff0c;题目如下&#xff1a; 为了解决这个问题&#xff0c;你可以遵循以下的思路&#xff1a; 1. 读取输入的两个整数A和B。 2. 使用一个for循环&#xff0c;从A遍历到B。 3. 在循环中&#xff0c;打印当…...

virsh管理虚拟机的命令行工具

virsh是一个管理虚拟机的命令行工具&#xff0c;提供了丰富的命令来查看、创建、管理虚拟机。以下是一些常用的virsh命令&#xff1a; 查看帮助和版本&#xff1a; virsh --help&#xff1a;查看virsh命令的帮助信息。virsh -version&#xff1a;查看virsh的版本信息。 查看虚…...

数据集成平台选型建议

一 数据集成介绍 数据集成平台是一种用于管理和协调数据流动的软件工具或服务。它的主要目标是将来自多个不同数据源的数据整合到一个统一的、易于访问和分析的数据存储库中。这些数据源可以包括数据库、云应用、传感器、日志文件、社交媒体等等。数据集成平台的关键任务是确保…...

Centos8安装Docker,使用阿里云源

一、前期准备 1.关闭防火墙&#xff0c;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是一个开源的跨平台多媒体处理工具套件&#xff0c;包含了用于处理音频、视频和图像的各种工具、库和命令行程序。它由一个主要的命令行工具ffmpeg和一系列相关工具组成&#xff0c;可以执行各种各样的多媒体操作。以下是FFmpeg中一些重要的概念&#xff1a; 音频、视频和…...

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层

项目场景&#xff1a; SpringBoot拦截器获取token用户对象优雅地传递到Controller层 问题描述 后端有许多接口都需要请求中携带有正确的Token&#xff0c;这时采用拦截器来验证token&#xff0c;但是每个接口都还是需要解析一遍token&#xff0c;浪费资源&#xff0c;不免显得…...

从零开始学HCIA之SDN03

1、VXLAN相关概念 &#xff08;1&#xff09;NVE&#xff08;Network Virtual Edge&#xff09;&#xff0c;网络虚拟化边界&#xff0c;是运行VXLAN的设备&#xff0c;其实体是一种虚拟逻辑接口&#xff0c;负责VXLAN数据的封装和解封装&#xff0c;其主要参数包括源VTEP以及…...

C语言深度理解之——结构体内存对齐

前言&#xff1a; 在C语言中&#xff0c;结构体&#xff08;struct&#xff09;是一种用户自定义的数据类型&#xff0c;可以包含不同类型的数据成员。在定义结构体时&#xff0c;编译器会根据平台的要求对结构体的内存进行对齐&#xff0c;以提高内存访问的效率。结构体内存对…...

LeetCode 热题 100 | 回溯(二)

目录 1 39. 组合总和 2 22. 括号生成 3 79. 单词搜索 菜鸟做题&#xff0c;语言是 C&#xff0c;感冒快好版 关于对回溯算法的理解请参照我的上一篇博客&#xff1b; 在之后的博客中&#xff0c;我将只分析回溯算法中的 for 循环。 1 39. 组合总和 题眼&#xff1a;c…...

混合内容错误https中加载了http

一、遇到问题 iframe嵌套时&#xff0c;混合内容错误https中加载了http&#xff0c;但是已经确认了ifreme中是https的&#xff0c;最后发现在/my/edit?applyid1改为/my/edit/?applyid1&#xff0c;加了一个斜杠&#xff0c;直接解决了 /my/edit是vue页面&#xff0c;其他页…...

游戏免费下载平台模板源码

功能介绍 此游戏网站模板源码是专门为游戏下载站而设计的&#xff0c;旨在为网站开发者提供一个高效、易于维护和扩展的解决方案。 特点&#xff1a; 响应式设计&#xff1a;我们的模板可以自适应不同设备屏幕大小&#xff0c;从而为不同平台的用户提供最佳的浏览体验。 …...

鸿蒙视频播放的实现

文章目录 前言播放效果视频播放的实现总结 一、前言 现在市面上很多应用都跟视频有关&#xff0c;那么在鸿蒙系统上怎么来播放视频呢&#xff0c;今天就讲解视频播放控件&#xff0c;让你也能快速地进行视频播放功能开发。 最后呢&#xff0c;我会提供一个鸿蒙中涉及的主要…...

QT----计算器

目录 1 搭建标准界面2、 逻辑编写2.1 初始化 github链接&#xff1a;基于qt的计算器 更多内容可以点击这里查看个人博客&#xff1a;个人博客 1 搭建标准界面 按照下图搭设界面 修改样式让这计算器看起来更像一点&#xff0c;同时对按钮分组进行样式编辑&#xff0c;添加字符…...

Linux:kubernetes(k8s)Deployment的操作(13)

创建deployment 命令 kubectl create deploy nginx-deploy --imagenginx:1.7.9 再去使用以下命令分别查询 ubectl get deploy kubectl get replicaset kubectl get pod 他是一个层层嵌套的一个关系 首先是创建了一个 deploy 里面包含着replicaset replicaset里面含有…...

20240619-James-快速鸟瞰并发编程, 呕心沥血整理的架构技术(第3篇)

接着第1, 2篇后&#xff0c;我们继续来跟进一下并发编程的其它内容&#xff0c;如下&#xff1a; 第9节 java.util.concurrent包 线程池 线程池的核心接口是ExecutorService。java.util.concurrent还提供了一个静态工厂类Executors&#xff0c;其中包含用于创建配置线程池的…...

C语言——详解字符函数和字符串函数(一)

Hi,铁子们好呀&#xff01;今天博主来给大家更一篇C语言的字符函数和字符串函数~ 具体讲的内容如下&#xff1a; 文章目录 &#x1f386;1.字符分类函数&#x1f4af;&#x1f4af;⏩1.1 什么是字符分类函数的&#xff1f;&#x1f4af;&#x1f4af;⏩1.2 字符函数的类型有哪…...