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

目录

六、单目操作符

七、逗号表达式

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

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.rhkb.cn/news/268269.html

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

相关文章

JVM相关问题

JVM相关问题 一、Java继承时父子类的初始化顺序是怎样的&#xff1f;二、JVM类加载的双亲委派模型&#xff1f;三、JDK为什么要设计双亲委派模型&#xff0c;有什么好处&#xff1f;四、可以打破JVM双亲委派模型吗&#xff1f;如何打破JVM双亲委派模型&#xff1f;五、什么是内…

Day03:Web架构OSS存储负载均衡CDN加速反向代理WAF防护

目录 WAF CDN OSS 反向代理 负载均衡 思维导图 章节知识点&#xff1a; 应用架构&#xff1a;Web/APP/云应用/三方服务/负载均衡等 安全产品&#xff1a;CDN/WAF/IDS/IPS/蜜罐/防火墙/杀毒等 渗透命令&#xff1a;文件上传下载/端口服务/Shell反弹等 抓包技术&#xff1a…

随机生成验证码

随机生成验证码 需求&#xff1a;随机生成一个任意位的验证码包含数字、大写字母和小写字母 1.代码实现 package com.ham;import java.util.Random;public class case2 {public static void main(String[] args) {System.out.println(code(4));}public static String code(i…

Jvm之内存泄漏

1 内存溢出 1.1 概念 java.lang.OutOfMemoryError&#xff0c;是指程序在申请内存时&#xff0c;没有足够的内存空间供其使用&#xff0c;出现OutOfMemoryError。产生该错误的原因主要包括&#xff1a;JVM内存过小。程序不严密&#xff0c;产生了过多的垃圾。 程序体现: 内…

Java二叉树(1)

&#x1f435;本篇文章将对二叉树的相关概念、性质和遍历等知识进行讲解 一、什么是树 在讲二叉树之前&#xff0c;先了解一下什么是树&#xff1a;树是一种非线性结构&#xff0c;其由许多节点和子节点组成&#xff0c;整体形状如一颗倒挂的树&#xff0c;比如下图&#xff1…

1. vue3-环境准备

1、安装node.js 如果开发环境上面没有安装node.js&#xff0c;需要到node.js官方网站下载node.js。下载安装后&#xff0c;可以通过npm --version查看nodejs版本 2. 开发工具 开发工具建议使用vscode

C#,数值计算,求解微分方程的吉尔(Gear)四阶方法与源代码

1 微分方程 微分方程&#xff0c;是指含有未知函数及其导数的关系式。解微分方程就是找出未知函数。 微分方程是伴随着微积分学一起发展起来的。微积分学的奠基人Newton和Leibniz的著作中都处理过与微分方程有关的问题。微分方程的应用十分广泛&#xff0c;可以解决许多与导数…

Linux 学习笔记(8)

八、 启动引导 1 、 Linux 的启动流程 1) BIOS 自检 2) 启动 GRUB/LILO 3) 运行 Linux kernel 并检测硬件 4) 挂载根文件系统 5) 运行 Linux 系统的第一个进程 init( 其 PID 永远为 1 &#xff0c;是所有其它进程的父进程 ) 6) init 读取系统引导配置文件…

分布式基础 --- Leader election

分布式基础 --- Leader election 为什么需要leader electionRing electionBully Algorithm 为什么需要leader election 在一组集群中, 需要选出一个leader来承担一些特别的任务, 比如 协调和控制系统操作&#xff1a;领导者负责协调和控制整个分布式系统的操作。它可以接收和处…

46、WEB攻防——通用漏洞PHP反序列化原生类漏洞绕过公私有属性

文章目录 几种常用的魔术方法1、__destruct()2、__tostring()3、__call()4、__get()5、__set()6、__sleep()7、__wakeup()8、__isset()9、__unset()9、__invoke() 三种变量属性极客2019 PHPphp原生类 几种常用的魔术方法 1、__destruct() 当删除一个对象或对象操作终止时被调…

数据中心GPU集群高性能组网技术分析

数据中心GPU集群组网技术是指将多个GPU设备连接在一起&#xff0c;形成一个高性能计算的集群系统。通过集群组网技术&#xff0c;可以实现多个GPU设备之间的协同计算&#xff0c;提供更大规模的计算能力&#xff0c;适用于需要大规模并行计算的应用场景。 常用的组网技术&…

码垛工作站:食品生产企业的转型助推器

在当今高度自动化的工业生产中&#xff0c;码垛工作站的应用正逐渐成为一种趋势。某食品生产企业在面临市场竞争加剧、人工成本上升等多重压力下&#xff0c;决定引入码垛工作站&#xff0c;以期实现生产流程的升级与变革。 一、码垛工作站引入背景 该企业主要从事休闲食品的…

iMazing3安全吗?好不好用?值不值得下载

一、安全性 iMazing在设计和开发过程中&#xff0c;始终把用户数据的安全性放在首位。它采用了多种先进的安全技术来确保用户数据在传输、备份和存储过程中的安全。 iMazing3Mac-最新绿色安装包下载如下&#xff1a; https://wm.makeding.com/iclk/?zoneid49816 iMazing3Wi…

mysql 常用命令练习

管理表格从表中查询数据从多个表查询修改数据sql变量类型 管理表格 创建一个包含三列的新表 CREATE TABLE products (id INT,name VARCHAR(255) NOT NULL,price INT DEFAULT 0,PRIMARY KEY(id) // 自增 ); 从数据库中删除表 DROP TABLE product; 向表中添加新列 ALTER TAB…

【Python】成功解决TypeError: list indices must be integers or slices, not float

【Python】成功解决TypeError: list indices must be integers or slices, not float &#x1f308; 个人主页&#xff1a;高斯小哥 &#x1f525; 高质量专栏&#xff1a;Matplotlib之旅&#xff1a;零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门教程&…

计算机二级Python刷题笔记------基本操作题11、14、17、21、30(考察列表)

文章目录 第十一题&#xff08;列表遍历&#xff09;第十四题&#xff08;len&#xff09;第十七题&#xff08;len、insert&#xff09;第二十一题&#xff08;append&#xff09;第三十题&#xff08;二维列表&#xff09; 第十一题&#xff08;列表遍历&#xff09; 题目&a…

c++之旅——第三弹

大家好啊&#xff0c;这里是c之旅第三弹&#xff0c;跟随我的步伐来开始这一篇的学习吧&#xff01; 如果有知识性错误&#xff0c;欢迎各位指正&#xff01;&#xff01;一起加油&#xff01;&#xff01; 创作不易&#xff0c;希望大家多多支持哦&#xff01; 一.命名空间;…

React-router的创建和第一个组件

需要先学react框架 首先&#xff1a;找到一个文件夹&#xff0c;在文件夹出打开cmd窗口&#xff0c;输入如下图的口令 npx create-react-app demo 然后等待安装 安装完成 接下来进入创建的demo实例 cd demo 然后可以用如下方式打开vscode code . 注意&#xff1a;不要忽略点号与…

vue2+elementui上传照片(el-upload 超简单)

文章目录 element上传附件&#xff08;el-upload 超详细&#xff09;代码展示html代码data中methods中接口写法 总结 element上传附件&#xff08;el-upload 超详细&#xff09; 这个功能其实比较常见的功能&#xff0c;后台管理系统基本上都有&#xff0c;这就离不开element的…

多层感知机 + 代码实现 - 动手学深度学习v2 | 李沐动手学深度学习课程笔记

感知机 感知机≈二分类问题 感知机和其他问题的对比 训练感知机 如果小于等于零&#xff0c;说明预测错啦 &#xff0c;其实就是同号为正&#xff0c;异号为负 举个分类的例子 增加样本&#xff0c;改变分类线 继续分类 感知机的收敛定理 XOR问题 XOR问题其实就是第1、3象限数…