初识结构体,整型提升及操作符的属性

news2025/6/7 22:10:55

目录

  • 一、结构体成员访问操作符
  • 1.1 结构体
  • 二、操作符的属性:优先级、结合性
    • 2.1 优先级
    • 2.2 结合性
      • C 运算符优先级
  • 三、表达式求值
    • 3.1 整型提升
    • 3.2 算数转化
  • 总结


一、结构体成员访问操作符

1.1 结构体

C语言已经提供了内置类型,如:char,short,int,long,float,double等,但是只有这些内置类型还是不够的,假设我想描述学生,描述一本书,这时单一的内置类型是不行的。

描述一个学生需要名字,年龄,学号,身高,体重等

描述一本书需要作者,出版社,定价等。C语言为了解决这个问题,增加了结构体这种自定义的数据类型,让程序员可以自己创造适合的类型。

注:结构是一些值的集合,这些值称为成员变量。结构的每个成员可以是不同类型的变量,如:标量、数组、指针,甚至是其他结构体。

这里可以和数组相比较

数组:是一组相同类型的元素的集合

struct tag
{
   member-list;
}variable-list;//变量列表

这里的member-list可能有多个值,值叫成员变量。variable-list变量列表可有可无。

//声明了一个结构体类型
struct Stu
{
	//1个或多个成员 - 这些成员都是用来描述学生的
	char name[20];
	int age;
	char id[11];
	float score;
	//...
} s6,s7,s8;//全局变量

其大体形式就如图示代码,s6,s7,s8就是变量列表,其相当于在声明类型的时候顺便创建了几个变量,相当于全局变量,也可以不写,在下面单独创建。

//声明了一个结构体类型
struct Stu
{
	//1个或多个成员 - 这些成员都是用来描述学生的
	char name[20];
	int age;
	char id[11];
	float score;
	//...
} s6,s7,s8;//全局变量,声明类型的同时定义s6,s7,s8

struct Stu s4;//全局变量,定义结构体变量s4
struct Stu s5;//全局变量

int main()
{
	int num = 0;
	struct Stu s1 = {"zhangsan", 20, "2024010102", 85.5f};
	struct Stu s2 = {.age=18, .name="wangcai",.score=95.5f,.id = "2025010102"};//指定顺序初始化

	struct Stu s3;//局部变量
	return 0;
}

在这里插入图片描述
编译器在默认情况下会将85.5认定为double类型,所以要加一个f,搞成float类型。

而且在默认情况下,结构体的初始化变量只能按顺序初始化,即按结构体的声明顺序来创建,如果想要指定初始化顺序,就要使用操作符(.)来访问结构体成员了。
使用方法:结构体变量.成员名

结构体也可以嵌套使用,即在结构体中引用结构体:

//声明了一个结构体类型
struct Peo
{
	char name[30];
	int age;
	char tele[12];
};

struct Ebook
{
	struct Peo data[100];//可以存放100个人的信息
	int count;//当前已经存的个数
};

int main()
{
	struct Peo p1 = {"zhangsan", 20, "15598888888"};
	struct Ebook eb = { {{"wangwu", 19, "13396668866"},{"cuihua", 18, "18696866688"}},  0};

	//printf("%s\n", p1.name);
	//printf("%d\n", p1.age);
	//printf("%s\n", p1.tele);

	printf("%s\n", eb.data[1].name);
	printf("%d\n", eb.data[1].age);
	printf("%s\n", eb.data[1].tele);
	//. : 结构成员访问操作符
	//结构体变量.结构体成员

	return 0;
}

这里也不太好说,直接看监视窗格就懂了:
在这里插入图片描述
在这里插入图片描述


二、操作符的属性:优先级、结合性

C语言的操作符有两个重要的属性:优先级、结合性,这两个属性决定了表达式求值的计算顺序。

2.1 优先级

优先级指的是,如果一个表达式包含多个运算符,哪个运算符应该优先执行。各种运算符的优先级是不一样的。

3 + 4 *5

该示例中,表达式3+45里既有加法运算符,又有乘法运算符。由于乘法的优先级高于加法,所以会先计算45,而不是先计算3+4.

2.2 结合性

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

5 * 6 / 2

该示例中,*和/的优先级相同,他们都是左结合运算符,所以从左到右执行,先计算5×6,再计算/2。

运算符的优先顺序很多,下面是部分运算符的优先级顺序(按照优先级从高到低排列)

  • 圆括号(())
  • 自增运算符(++),自减运算符(–)
  • 单目运算符(+和-)
  • 乘法(*),除法(/)
  • 加法(+),减法(-)
  • 关系运算符(<、>等)
  • 赋值运算符(=)

补充:圆括号的优先级是最高的,可以使用它来改变其他运算符的优先级。

C 运算符优先级

优先级运算符描述结合性
1++ –
()
[]
.
->
(type){list}
后缀/后置自增和自减
函数调用
数组下标
结构体和共用体成员访问
通过指针访问结构体和共用体成员
复合字面量[C99]
从左到右
2++ –
+ -
! ~
(type)
*
&
sizeof
_Alignof
前缀自增和自减[注释1]
单目正负
逻辑非和按位取反
强制类型转换
间接访问(解引用)
取地址
求大小[注释2]
对齐要求[C11]
从右到左
3* / %乘法、除法和取余从左到右
4+ -加法和减法从左到右
5<< >>按位左移和右移从左到右
6< <=用于关系运算符 < 和 ≤ (分别对应)-
7> >=用于关系运算符 > 和 ≥ (分别对应)-
8== !=用于关系运算符 ==(等于)和 !=(不等于) (分别对应)-
9&按位与-
10^按位异或(独占或)-
11|按位或(包含或)-
12&&逻辑与-
13||逻辑或-
14?:条件运算符[注释3]从右到左
15[注释4]=
+= -=
*= /= %=
<<= >>=
&= ^= |=
简单赋值
加法赋值、减法赋值
乘法赋值、除法赋值、取余赋值
按位左移赋值、按位右移赋值
按位与赋值、按位异或赋值、按位或赋值
-
16,逗号从左到右

三、表达式求值

3.1 整型提升

C语言中整型算术运算总是至少以默认整型类型的精度来进行的。

为了获得这个精度,表达式中的字符和短整型操作数在使用之前被转换为普通整型,这种转换称为整型提升

整型提升的意义
表达式中的整型运算要在CPU的响应运算器件内执行,CPU整型运算器(ALU)的操作数的字节长度一般就是int的字节长度,同时也是CPU的通用寄存器的长度。
因此,即使两个char类型的相加,在CPU执行时实际上也要先转换为CPU内整型操作数的标准长度。
通用CPU(general-purpose CPU)是难以直接实现两个8比特字节直接相加运算(虽然极其指令中可能有这种字节相加指令)。所以,表达式中各种长度可能小于int长度的整型值,都必须先转换为int或unsigned int,然后才能送入CPU去执行运算。

如何进行整型提升呢?

  1. 有符号整数提升是按照变量的数据类型的符号位来提升的
  2. 无符号整数提升,高位补0

多说无益,拿例子来看:
在这里插入图片描述
看到这串代码,你的第一反应c的值是多少呢?
会不会是140呢?
哈哈我既然拿出来了,它当然就没有那么简单了,打印出的值是-116

首先排除140,因为char类型的取值范围是:-128-127,他根本就存不下140,这里就要进行整型提升的操作:

首先这里20是int类型,4个字节要放到char里面去,char只有一个字节的空间,所以只能有8个比特位,这就需要截断一部分了,这里是截断高位,保留低位,这里a和b相加的时候要发生整型提升
在这里插入图片描述
在我们当前的msvc编译器下,char就是所谓的signed char,所以整型提升就按第一个走

过程展示

在这里插入图片描述

因为这里%d注释处的原因,加和起来的c也需要整型提升

3.2 算数转化

如果某个操作符的各个操作数属于不同的类型,那么除非其中一个操作数转换为另一个操作数的类型,否则操作无法进行,下面的图中的层次体系就称为寻常算术转换
在这里插入图片描述
编译器会根据内容自动转换数据类型,是由小的类型向大的类型转化,就如箭头所指方向
在这里插入图片描述
比如这里整型100+浮点型55.5,编译器就会自动将整型100转换为浮点型100,再进行相加和。


总结

虽然在这里已经有了操作符的优先级和结合性,但如果我们写代码的时候表达式过于复杂,计算结果的路径不唯一,一串代码同一函数多次调用,任有可能写出问题代码(因为调用的先后次序无从得知,不同编译器下的计算次序可能不同),所以在平时写代码的时候,表达式还是建议多次拆分,简单化更好。

这次决定把文章的重点内容设为标题看一看效果,因为前几篇文章流量不太好,有点小伤心,希望喜欢作者文章的靓仔靓女多多点赞支持一下,你们的支持就是我最大的动力!

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

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

相关文章

检测到 #include 错误。请更新 includePath。已为此翻译单元(D:\软件\vscode\test.c)禁用波形曲线

原文链接&#xff1a;【VScodeMinGw】安装配置教程 下载mingw64 打开可以看到bin文件夹下是多个.exe文件&#xff0c;gcc.exe地址在环境配置中要用到 原文链接&#xff1a;VSCode中出现“#include错误&#xff0c;请更新includePath“问题&#xff0c;解决方法 重新VScode后…

2025年,百度智能云打响AI落地升维战

如果说从AI到Agent是对于产品落地形态的共识&#xff0c;那么如今百度智能云打响的恰是一个基于Agent进行TO B行业表达的AI生产力升维战。 在这个新的工程体系能力里&#xff0c;除了之前百度Create大会上提出的面向Agent的RAG能力等通用能力模块&#xff0c;对更为专业、个性…

Seed1.5-VL登顶,国产闭源模型弯道超车丨多模态模型5月最新榜单揭晓

随着图像、文本、语音、视频等多模态信息融合能力的持续增强&#xff0c;多模态大模型在感知理解、逻辑推理和内容生成等任务中的综合表现不断提升&#xff0c;正在展现出愈发接近人类的智能水平。多模态能力也正在从底层的感知理解&#xff0c;迈向具备认知、推理、决策能力的…

第3章——SSM整合

一、整合持久层框架MyBatis 1.准备数据库表及数据 创建数据库&#xff1a;springboot 使用IDEA工具自带的mysql插件来完成表的创建和数据的准备&#xff1a; 创建表 表创建成功后&#xff0c;为表准备数据&#xff0c;如下&#xff1a; 2.创建SpringBoot项目 使用脚手架创建…

VTK 显示文字、图片及2D/3D图

1. 基本环境设置 首先确保你已经安装了VTK库&#xff0c;并配置好了C开发环境。 #include <vtkSmartPointer.h> #include <vtkRenderWindow.h> #include <vtkRenderWindowInteractor.h> #include <vtkRenderer.h> 2. 显示文字 2D文字 #include &l…

小白如何在cursor中使用mcp服务——以使用notion的api为例

1. 首先安装node.js,在这一步的时候不要勾选不要勾选 2. 安装完之后,前往notion页面 我的创作者个人资料 | Notion 前往集成页面&#xff0c;添加新集成&#xff0c;自己输入名字&#xff0c;选择内部 新建完之后&#xff0c;进入选择只读 复制密匙 然后前往cursor页面 新建…

引领AI安全新时代 Accelerate 2025北亚巡展·北京站成功举办

6月5日&#xff0c;网络安全行业年度盛会——"Accelerate 2025北亚巡展北京站"圆满落幕&#xff01;来自智库、产业界、Fortinet管理层及技术团队的权威专家&#xff0c;与来自各行业的企业客户代表齐聚一堂&#xff0c;围绕"AI智御全球引领安全新时代"主题…

为什么说数列是特殊的函数

文章目录 前情概要函数特性特殊之处典例剖析前情概要 高三的学生几乎都听老师说过,数列是特殊的函数,那么如何理解这句话呢,无外乎需要关注两点:①函数性,②特殊性,以下举例说明,帮助各位学子理解。 函数特性 既然是按照一定的次序排列而成的一列数字,那么这些数字(…

解决uniapp开发app map组件最高层级 遮挡自定义解决底部tabbar方法

subNvue&#xff0c;是 vue 页面的原生子窗体&#xff0c;把weex渲染的原生界面当做 vue 页面的子窗体覆盖在页面上。它不是全屏页面&#xff0c;它给App平台vue页面中的层级覆盖和原生界面自定义提供了更强大和灵活的解决方案。它也不是组件&#xff0c;就是一个原生子窗体。 …

96. 2017年蓝桥杯省赛 - Excel地址(困难)- 进制转换

96. Excel地址&#xff08;进制转换&#xff09; 1. 2017年蓝桥杯省赛 - Excel地址&#xff08;困难&#xff09; 标签&#xff1a;2017 省赛 1.1 题目描述 Excel 单元格的地址表示很有趣&#xff0c;它使用字母来表示列号。 比如&#xff0c; A 表示第 1 列&#xff0c;…

PPT转图片拼贴工具 v1.0

软件介绍 这个软件的作用就是将单个PPT的每一页转换为单独的图片&#xff0c;然后将图片进行拼接起来。 但是我没有还没有解决一次性处理多个文件。 效果展示如下&#xff1a; 软件安装 软件源码 import os import re import win32com.client from PIL import Imagedef con…

【行驶证识别成表格】批量OCR行驶证识别与Excel自动化处理系统,行驶证扫描件和照片图片识别后保存为Excel表格,基于QT和华为ocr识别的实现教程

在车辆管理、物流运输、保险理赔等领域&#xff0c;经常需要处理大量的行驶证信息。传统的人工录入方式效率低、易出错&#xff0c;而使用 OCR 技术可以自动识别行驶证图片中的文字信息&#xff0c;极大提高数据处理效率。该系统可以应用于以下场景&#xff1a; 保险公司快速…

Linux--进程的状态

1.进程状态在所有系统中宏观的大致模型 1.1、进程状态与变迁 基础状态&#xff1a;涵盖创建、就绪、运行、阻塞、结束等核心状态&#xff0c;描述进程从诞生到消亡的生命周期流转&#xff0c;如创建后进入就绪&#xff0c;争抢 CPU 进入运行&#xff0c;遇 I/O 或资源等待则转…

(nice!!!)(LeetCode每日一题)2434. 使用机器人打印字典序最小的字符串(贪心+栈)

题目&#xff1a;2434. 使用机器人打印字典序最小的字符串 思路&#xff1a;贪心栈&#xff0c;时间复杂度0(n)。 字符串t其实就是栈&#xff0c;后进先出。要让p的字典序最小&#xff0c;那当然是t每次弹出的字符&#xff0c;都小于或等于“剩下未入t里的字符串的字符”&#…

008-libb64 你有多理解base64?-C++开源库108杰

正确认识二进制数据和文本数据的关系;深刻理解 base64 编码核心等式&#xff1a;256256256 64646464 经常听到——以至 AI 也会这么回答的&#xff1a;base64 编码用于将二进制数据&#xff0c;转换为文本数据。但是&#xff0c;众所周知&#xff0c;在数字电子计算机中&#…

电子电路基础2(杂乱)

电容器 容抗 滤波电路&#xff08;半波&#xff09; 全波整流 因为A点的电压比D点的电压高&#xff0c;所以D点会走向C点 电感基础 什么是电感器&#xff1f; 一种把电能转换成磁能&#xff0c;并可以将磁能存储起来的元器件。 在嵌入式开发中&#xff0c;电感主要用于动态能量…

LazyOwn RedTeam/APT 框架是第一个具有人工智能驱动的 CC 的 RedTeam 框架

一、软件介绍 文末提供程序和源码下载 LazyOwn RedTeam/APT 框架是第一个具有人工智能驱动的 C&C 的 RedTeam 框架&#xff0c;具有隐藏活动的 rootkit、与 Windows/Linux/Mac OSX 兼容的不可检测的可塑植入物&#xff0c;以及自配置后门。凭借其 Web 界面和强大的…

电脑的ip地址会自动变怎么办?原因解析和解决方法

在当今互联网时代&#xff0c;IP地址是每台联网设备的"身份证"&#xff0c;但很多用户都遇到过IP地址自动变化的情况。这种现象既可能发生在内网&#xff08;局域网&#xff09;环境中&#xff0c;也可能出现在外网&#xff08;公网&#xff09;连接中。要理解IP地址…

PDF 转 HTML5 —— HTML5 填充图形不支持 Even-Odd 奇偶规则?(第一部分)

在填充 PDF 中的图形时&#xff08;以及许多其他技术中&#xff09;&#xff0c;你可以选择使用 Even-Odd&#xff08;奇偶&#xff09; 或 Non-Zero&#xff08;非零&#xff09; 填充规则。 对于那些已经在想“你在说啥&#xff1f;”的朋友&#xff0c;别担心&#xff0c;我…

【八股消消乐】MySQL参数优化大汇总

&#x1f60a;你好&#xff0c;我是小航&#xff0c;一个正在变秃、变强的文艺倾年。 &#x1f514;本专栏《八股消消乐》旨在记录个人所背的八股文&#xff0c;包括Java/Go开发、Vue开发、系统架构、大模型开发、具身智能、机器学习、深度学习、力扣算法等相关知识点&#xff…