C语言---操作符的详解(下)

 

目录

1. 结构成员访问操作符

1.1 结构体

1.2结构体成员访问操作符

1.2.1 直接访问

1.2.2 间接访问

2. 操作符的属性

2.1 优先级

2.2 结合性

 3. 表达式求值

3.1 整型提升(类型小于int)

3.2 算术转换(类型大于int)


1. 结构成员访问操作符

1.1 结构体

C语言中提供了许多内置类型,如:char、short、int、long、float、double等,但是只要这些是远远不够的,C语⾔为了解决,增加了结构体这种⾃定义的数据类型,让程序员可以⾃⼰创造适合的类型。

结构是⼀些值的集合,这些值称为成员变量。结构的每个成员可以是不同类型的变量,如:
标量、数组、指针,甚⾄是其他结构体。(结构体成员至少一位)
struct tag
{member-list;
}variable-list;

假如描述一个学生:

struct Stu
{char name[20];//名字int age;//年龄float score;//成绩 
}s3,s4;//这里的分号不能忘了    s3,s4也是结构体变量,但是是全局变量
int main()
{struct Stu s1;//创建的结构体变量,局部变量struct Stu s2;return 0;
}
//结构体初始化
struct Stu
{char name[20];//名字int age;//年龄float score;//成绩 
}s3={"wangwe",33.66.0f},s4={"翠花",18,100.0f};//初始化
int main()
{struct Stu s1={"zhangsan",20,95.5f};//初始化struct Stu s2={"lisi",18,87.5f};return 0;
}
//结构体包含结构体
struct Point
{int x;int y;
};
struct Data
{int num;struct Point p;
};
int main()
{struct Data b = { 100,{1,2} };return 0;
}

1.2结构体成员访问操作符

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

1.2.2 间接访问

有时候我们得到的不是⼀个结构体变量,⽽是得到了⼀个指向结构体的指针。这时就要用到间接访问

使⽤⽅式:结构体指针->成员名

#include <stdio.h>
struct Point
{int x;int y;
};
int main()
{struct Point p = { 3, 4 };//结构体变量struct Point* ps= &p;//结构体指针,指针指向p的地址ps->x = 10;ps->y = 20;printf("x = %d y = %d\n", ps->x, ps->y);return 0;
}

2. 操作符的属性

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

2.1 优先级

优先级指的是,如果⼀个表达式包含多个运算符,哪个运算符应该优先执⾏。各种运算符的优先级是不⼀样的。相邻操作符,优先级高的先执行,优先级低的后执行!!!

1+2*3
//这里我们知道肯定先算乘,后算加

2.2 结合性

如果两个运算符优先级相同,这时候就看结合性了,根据运算符 是左结合,还是右结合,决定执行顺序。

1*2/3
//这里乘和除的优先级相同,他们都是左结合运算符,所以从左到右执⾏

 3. 表达式求值

3.1 整型提升(类型小于int)

C语⾔中整型算术运算总是⾄少以默认整型类型的精度来进⾏的。为了获得这个精度,表达式中的字符(char)和短整型(short)操作数在使⽤之前被转换为普通整型(int),这种转换称为整型提升

int main()
{char c1 = 125;char c2 = 12;char c3 = c1+c2;printf("%d\n", c3);return 0;
}

 

 如何进⾏整体提升呢?

//负数的整形提升
char c1 = -1;
变量c1的⼆进制位(补码)中只有8个⽐特位:
1111111
因为 char 为有符号的 char
所以整形提升的时候,⾼位补充符号位,即为1
提升之后的结果是:
11111111111111111111111111111111
//正数的整形提升
char c2 = 1;
变量c2的⼆进制位(补码)中只有8个⽐特位:
00000001
因为 char 为有符号的 char
所以整形提升的时候,⾼位补充符号位,即为0
提升之后的结果是:
00000000000000000000000000000001
//⽆符号整形提升,⾼位补0
//举例
int main()
{//char 类型的取值范围是-128——127char c1 = 125;//01111101-c1-有符合的charchar c2 = 10;//00001010-c2-有符合的charchar c3 = c1+c2;//10000111-c3//11111111111111111111111110000111-c3--提升后(补码)printf("%d\n", c3);return 0;
}

3.2 算术转换(类型大于int)

如果某个操作符的各个操作数属于不同的类型,那么除⾮其中⼀个操作数的转换为另⼀个操作数的类型,否则操作就⽆法进⾏。下⾯的层次体系称为寻常算术转换。

long double
double
float
unsigned long int
long int
unsigned int
int
//如果某个操作数的类型在上⾯这个列表中排名靠后,
//那么⾸先要转换为另外⼀个操作数的类型后执⾏运算。

 注意:即使有了操作符的优先级和结合性,我们写出的表达式依然有可能不能通过操作符的属性确定唯⼀的计算路径,那这个表达式就是存在潜在⻛险的,建议不要写出特别负责的表达式。

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

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

相关文章

2023/11/28JAVAweb学习

查找哪个进程占用了该端口号 跳过某一个阶段

比特币上的有状态多重签名

无需链下通信 介绍 随着区块链和加密货币空间的发展&#xff0c;越来越需要增强安全措施来保护数字资产。 应对这一挑战的突出解决方案之一是多重签名&#xff08;多重签名&#xff09;钱包。 这些钱包在执行交易之前需要多方签名&#xff0c;从而提供额外的安全层来防止未经授…

Vue diff 算法探秘:如何实现快速渲染

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

微软Azure AI新增Phi、Jais等,40种新大模型

微软在官方宣布在Azure AI云开发平台中&#xff0c;新增了Falcon、Phi、Jais、Code Llama、CLIP、Whisper V3、Stable Diffusion等40个新模型&#xff0c;涵盖文本、图像、代码、语音等内容生成。 开发人员只需要通过API或SDK就能快速将模型集成在应用程序中&#xff0c;同时支…

docker (简介、dcoker详细安装步骤、容器常用命令)一站打包- day01

一、 为什么出现 Docker是基于Go语言实现的云开源项目。 Docker的主要目标是“Build&#xff0c;Ship and Run Any App,Anywhere”&#xff0c;也就是通过对应用组件的封装、分发、部署、运行等生命周期的管理&#xff0c;使用户的APP&#xff08;可以是一个WEB应用或数据库应…

InstructDiffusion-多种视觉任务统一框架

论文:《InstructDiffusion: A Generalist Modeling Interface for Vision Tasks》 github&#xff1a;https://github.com/cientgu/InstructDiffusion InstructPix2Pix&#xff1a;参考 文章目录 摘要引言算法视觉任务统一引导训练集重构统一框架 实验训练集关键点检测分割图像…

推荐6款交互设计软件,助你事半功倍!

交互软件可以帮助设计师从“可用性”和“用户体验”的角度优化他们的作品。如果设计师想创建一个令人满意的交互设计作品&#xff0c;一个方便的交互设计软件是必不可少的。当然&#xff0c;交互软件只是我们实现目标的一种手段。根据设计师的个人喜好和方便&#xff0c;选择易…

TS版LangChain实战:基于文档的增强检索(RAG) | 京东云技术团队

LangChain LangChain是一个以 LLM &#xff08;大语言模型&#xff09;模型为核心的开发框架&#xff0c;LangChain的主要特性&#xff1a; 可以连接多种数据源&#xff0c;比如网页链接、本地PDF文件、向量数据库等允许语言模型与其环境交互封装了Model I/O&#xff08;输入…

Wangeditor工具栏配置

包下载 pnpm add wangeditor/editor pnpm add wangeditor/editor-for-vue import wangeditor/editor/dist/css/style.css // 引入 css import { Editor, Toolbar } from wangeditor/editor-for-vue import { DomEditor } from wangeditor/editor <Toolbar style"border…

免费好用的伪原创工具推荐,都是国内的人工智能AI

在当今数字化信息爆炸的时代&#xff0c;创作者们为了在激烈的竞争中脱颖而出&#xff0c;常常需要花费大量时间来创作独特的内容。然而&#xff0c;有时候时间并不是每个人都拥有充足的资源。于是&#xff0c;一些免费智能伪原创工具成为了许多创作者的利器&#xff0c;能够在…

Docker基本操作---镜像与容器操作

Docker基本操作---镜像与容器操作 1. 操作镜像1.1 查看镜像1.2 删除镜像1.2.1 删除镜像1.2.2 强制删除镜像1.2.3 删除所有镜像 1.3 启动镜像1.4 常见错误1.4.1 image is being used by stopped container e3b9df6dc6ae 2 操作容器2.1 新建启动容器2.2 查看正在运行的容器2.3 退…

修改二进制程序的rpath和interpreter, 实现“高版本gcc编译出的程序在低版本glibc机器上运行“实验记录

编译环境&#xff1a; ubuntu20.04 gcc (Ubuntu 9.3.0-17ubuntu1~20.04) 9.3.0 g (Ubuntu 9.3.0-17ubuntu1~20.04) 9.3.0 运行环境&#xff1a; centos7.9 gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-44) g (GCC) 4.8.5 20150623 (Red Hat 4.8.5-44) 验证源文件 main.cpp: #inc…