武器大师——操作符详解(下)

目录

六、单目操作符

七、逗号表达式

八、下标引用以及函数调用

8.1.下标引用

8.2.函数调用

九、结构体

9.1.结构体

9.1.1结构的声明

9.1.2结构体的定义和初始化

9.2.结构成员访问操作符

9.2.1直接访问

9.2.2间接访问

十、操作符的属性

10.1.优先性

10.2.结合性

十一、整形提升

结语


六、单目操作符

!、 ++ -- & * + - ~ sizeof ( 类型 )

 上述操作符中,我们在前面都说过,只有&和*没有提及,这两个操作符我们会在指针章节详细介绍。

七、逗号表达式

a1,a2,a3,.....an

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

它是按从左到右的顺序依次执行。整个表达式的结果是最后一个表达式的结果。

eg:

int a = 1;
int b = 2;
int c = (a>b, a=b+10, a, b=a+1);

首先,从左到右依次执行 ,先是a>b,然后把b+10赋给a,a就变成了12,最后再将a+1的值赋给b,这个表达式的值就是整个表达式的值,也就是13,所以c为13。

八、下标引用以及函数调用

8.1.下标引用

我们在数组中曾见过这对中括号,是的,它的名字叫下标引用。

操作数:数组名+索引值

eg:

int arr[10];//创建数组
arr[9] = 10;//实⽤下标引⽤操作符。
[]的两个操作数是arr和9。

8.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;
}

 接下来讲点没见过的。

九、结构体

我们今天只是简单介绍,后面还会继续详细介绍结构体(又挖坑)。

9.1.结构体

我们之前学过许多数据类型结构,像short、char、int、double......但只有这些其实远远不够,比如说我想描述一个学生的信息,身高体重各科成绩等等。C语言为了解决这个问题,内置了结构体这种自定义类型,从此之后,我们可以创造出自己想要的类型。
结构是⼀些值的集合,这些值称为成员变量。结构的每个成员可以是不同类型的变量,如:
标量、数组、指针,甚⾄是其他结构体。
9.1.1结构的声明
struct tag
{member-list;//成员列表
}variable-list //变量列表

 其中tag表述结构体名,花括号里面放着成员列表,也就是要描述对象的各种属性。变量列表用来存放定义为该结构体类型的变量。

struct Stu
{char name[20];//名字int age;//年龄char sex[5];//性别char id[20];//学号
}; //分号不能丢
9.1.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};//结构体嵌套初始化

9.2.结构成员访问操作符

9.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;
}

这个点很小,但是很有用!

9.2.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;
}

十、操作符的属性

10.1.优先性

参考链接:C 运算符优先级 - cppreference.com 

   圆括号( ()
⾃增运算符( ++ ),⾃减运算符( --
单⽬运算符( + -
乘法( * ),除法( /
加法( + ),减法( -
关系运算符( < > 等)
赋值运算符( =
由于圆括号的优先级最⾼,可以使⽤它改变其他运算符的优先级。
 
大概记住这些就够了,其它可以现查表。

10.2.结合性

如果两个运算符优先级相同,优先级没办法确定先计算哪个了,这时候就看结合性了,则根据运算符 是左结合,还是右结合,决定执⾏顺序。⼤部分运算符是左结合(从左到右执⾏),少数运算符是右结合(从右到左执⾏),⽐如赋值运算符( = )。

十一、整形提升

C语⾔中整型算术运算总是⾄少以缺省整型类型的精度来进⾏的。

而为了获得这种精度,表达式中的字符型和短整型在使用之前就会被转换为整形,这种转换叫整形提升 

表达式的整型运算要在CPU的相应运算器件内执⾏,CPU内整型运算器(ALU)的操作数的字节长度⼀般就是int的字节⻓度,同时也是CPU的通⽤寄存器的⻓度。
因此,即使两个char类型的相加,在CPU执⾏时实际上也要先转换为CPU内整型操作数的标准长度。
通⽤CPU(general-purpose CPU)是难以直接实现两个8⽐特字节直接相加运算(虽然机器指令中可能有这种字节相加指令)。所以,表达式中各种⻓度可能⼩于int⻓度的整型值,都必须先转换为int或unsigned int,然后才能送⼊CPU去执⾏运算。
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
//⽆符号整形提升,⾼位补0

结语

有很多朋友问为什么以武器大师来做标题,这里结尾给大家解释一下,因为我觉得它就像不同人手中不同的工具,比如算数操作符像是数学家手中的计算器,关系操作符像是侦探手中的证据对比工具,逻辑操作符类似于法官手中的判决书,位操作符更像电路工程师的开关和转换器,赋值操作符像是建筑师手中的蓝图和材料......

其实我们学习每样东西都是,虽然有时很抽象,但是我们总能找到解决办法。

“细想全是问题,去做全是答案”。

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

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

相关文章

sql基本语法+实验实践

sql语法 注释&#xff1a; 单行 --注释内容# 注释内容多行 /* 注释内容 */数据定义语言DDL 查询所有数据库 show databases;注意是databases而不是database。 查询当前数据库 select database();创建数据库 create database [if not exists] 数据库名 [default charset 字符…

备战蓝桥杯Day22 - 计数排序

计数排序问题描述 对列表进行排序&#xff0c;已知列表中的数范围都在0-100之间。设计时间复杂度为O(n)的算法。 比如列表中有一串数字&#xff0c;2 5 3 1 6 3 2 1 &#xff0c;需要将他们按照从小到大的次序排列&#xff0c;得到1 1 2 2 3 3 5 6 的结果。那么此时计数排序是…

Jetson Xavier NX 开发板Ubuntu18.04 安装arduino IDE详细步骤

Jetson 平台是arch架构&#xff0c;官网上面几乎都是x86或者arm64的这两种错误版本都存在匹配问题无法使用&#xff0c;不要下载不要下载&#xff01; uname -a #版本查询1.正确下载打开方式 https://downloads.arduino.cc/arduino-1.8.19-linuxaarch64.tar.xz选择自己想要下…

LeetCode #104 二叉树的最大深度

104. 二叉树的最大深度 题目 二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。 示例 1&#xff1a; 输入&#xff1a;root [3,9,20,null,null,15,7] 输出&#xff1a;3 示例 2&#xff1a; 输入&#xff1a;root [1,null,2] 输出&#xff1a;2 分析 …

【Godot4自学手册】第十九节敌人的血量显示及掉血特效

这一节&#xff0c;我主要学习敌人的血量显示、掉血显示和死亡效果。敌人的血量显示和主人公的血量显示有所不同&#xff0c;主要是在敌人头顶有个红色的血条&#xff0c;受到攻击敌人的血条会减少&#xff0c;并且有掉血数量的文字显示&#xff0c;效果如下&#xff1a; 一、…

基于springboot+vue的医院后台管理系统

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战&#xff0c;欢迎高校老师\讲师\同行交流合作 ​主要内容&#xff1a;毕业设计(Javaweb项目|小程序|Pyt…

SMBGhost漏洞技术分析与防御方案

事件分析 最近国内外各安全厂商都发布了SMBGhost(CVE-2020-0796)漏洞的预警报告和分析报告&#xff0c;笔者利用周末休息时间也研究了一下&#xff0c;就算是做一个笔记了&#xff0c;分享给大家一起学习下&#xff0c;目前外面研究的POC大部分是通过SMB压缩数据包长度整数溢出…

如何根据玩家数量和游戏需求选择最合适的服务器配置?

根据玩家数量和游戏需求选择最合适的服务器配置&#xff0c;首先需要考虑游戏的类型、玩家数量、预计的在线时间以及对内存和CPU性能的需求综合考虑。对于大型多人在线游戏&#xff0c;如MMORPG或MOBA等&#xff0c;由于需要更多的CPU核心数来支持更复杂的游戏逻辑和处理大量数…

操作系统|概述|系统分类——笔记

1.1_1操作系统的概念和功能 操作系统的概念 操作系统&#xff08;Operating System&#xff0c; OS&#xff09; 是指控制和管理整个计算机系统的 硬件和软件 资源&#xff0c;并合理地组织调度计算机和工作和资源的分配&#xff1b; 1操作系统是系统资源的管理者 以提供给用…

文件的顺序读写函数举例介绍

目录 例1&#xff1a;&#xff08;使用字符输出函数fputc&#xff09;例2&#xff1a;&#xff08;使用字符输入函数fgetc&#xff09;例3&#xff1a;&#xff08;使用文本行输出函数fputs &#xff09;例4&#xff1a;&#xff08;使用文本行输入函数fgets &#xff09;例5&a…

Docker基础教程 - 2 Docker安装

更好的阅读体验&#xff1a;点这里 &#xff08; www.doubibiji.com &#xff09; 2 Docker安装 Docker 的官网地址&#xff1a;https://www.docker.com/&#xff0c;在官网可以找到 Docker Engine 的安装步骤。 下面进行 Docker 环境的安装&#xff0c;正常情况下 Docker …

服务发现:CP or AP?

1 服务发现的意义 为高可用&#xff0c;生产环境中服务提供方都以集群对外提供服务&#xff0c;集群里这些IP随时可能变化&#xff0c;也需要用一本“通信录”及时获取对应服务节点&#xff0c;这获取过程即“服务发现”。 对服务调用方和服务提供方&#xff0c;其契约就是接…

(3)(3.1) FlightDeck FrSky发射器应用程序

文章目录 前言 1 概述 2 Turnkey Packages 3 参数说明 前言 ​Craft and Theory 的 FlightDeck 可让你轻松查看飞行模式、高度、速度、姿态和关键系统警报&#xff0c;包括故障保护和电池错误&#xff0c;如电池不平衡警告和发射机低电量警报。 1 概述 Craft and Theory 的…

【自然语言处理】NLP入门(二):1、正则表达式与Python中的实现(2):字符串格式化输出(%、format()、f-string)

文章目录 一、前言二、正则表达式与Python中的实现1.字符串构造2. 字符串截取3. 字符串格式化输出3.1 %符号格式化字符串1. 一般形式2. 常用格式字符3. 最小宽度和精度4. 进位制和科学计数法5. 多个对象的格式化输出6. 典例 3.2 format()方法格式化字符串1. 一般形式2. 参数传递…

51单片机-(中断系统)

51单片机-&#xff08;中断系统&#xff09; 了解51单片机中断系统、中断源、中断响应条件和优先级等&#xff0c;通过外部中断0实现按键控制LED亮灭为例理解中断工作原理和编程实现过程。 1.中断系统结构 89C51/52的中断系统有5个中断源 &#xff0c;2个优先级&#xff0c;…

WiFi模块引领智能家居革命:连接未来的生活

随着科技的快速发展&#xff0c;智能家居正成为现代生活的一部分&#xff0c;极大地改变了我们与家庭环境互动的方式。其中&#xff0c;WiFi模块作为关键的连接技术&#xff0c;在推动智能家居革命中发挥着不可忽视的作用。本文将深入探讨WiFi模块如何驱动智能家居革命。 设备互…

【探索Linux】—— 强大的命令行工具 P.24(网络基础)

阅读导航 引言一、计算机网络背景1. 网络发展历史 二、认识 "协议"1. 网络协议概念2. 网络协议初识&#xff08;1&#xff09;协议分层&#xff08;2&#xff09;OSI参考模型&#xff08;Open Systems Interconnection Reference Model&#xff09;&#xff08;3&…

NoSQL--1.虚拟机网络配置

目录 1.初识NoSQL 1.1 NoSQL之虚拟机网络配置 1.1.1 首先&#xff0c;导入预先配置好的NoSQL版本到VMware Workstation中 1.1.2 开启虚拟机操作&#xff1a; 1.1.2.1 点击开启虚拟机&#xff1a; 1.1.2.2 默认选择回车CentOS Linux&#xff08;3.10.0-1127.e17.x86_64) 7 …

MCU 串口接收环形缓冲区的实现

环形缓冲区 1. 环形缓冲区的特性 1.先进先出 2. 当缓冲区被使用完&#xff0c;且又有新的数据需要存储时&#xff0c;丢掉历史最久的数据&#xff0c;保存最新的数据 现实中的存储介质都是线性的&#xff0c;因此我们需要做一下处理&#xff0c;才能在功能上实现环形缓冲区 …

[计算机网络]--I/O多路转接之poll和epoll

前言 作者&#xff1a;小蜗牛向前冲 名言&#xff1a;我可以接受失败&#xff0c;但我不能接受放弃 如果觉的博主的文章还不错的话&#xff0c;还请点赞&#xff0c;收藏&#xff0c;关注&#x1f440;支持博主。如果发现有问题的地方欢迎❀大家在评论区指正 目录 一、poll函…