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

【零基础学Rust | 基础系列 | 基础语法】变量,数据类型,运算符,控制流

在这里插入图片描述


文章目录

  • 简介:
  • 一,变量
    • 1,变量的定义
    • 2,变量的可变性
    • 3,变量的隐藏
  • 二、数据类型
    • 1,标量类型
    • 2,复合类型
  • 三,运算符
    • 1,算术运算符
    • 2,比较运算符
    • 3,逻辑运算符
    • 4,位运算符
    • 5,赋值运算符
  • 四、控制流
    • 1,条件语句
    • 2,循环语句
  • 总结


简介:

本章节将详细介绍Rust的基础语法,包括变量,数据类型,运算符,以及控制流。每个部分都将提供详细的解释和代码示例,以便于理解和学习。


一,变量

在编程语言中,变量是一种基本的概念,它们是用来存储数据的。在Rust中,变量的特性和其他语言有所不同。

1,变量的定义

在Rust中,变量的定义使用let关键字。定义变量的基本格式是let 变量名 = 变量值;。例如,定义一个整数变量x,并赋值为5,可以写成let x = 5;

let x = 5;

在这个例子中,x就是变量名,5就是变量值。注意,Rust是一种静态类型语言,这意味着在编译时就必须知道所有变量的类型。但是,Rust有一个强大的类型推断系统,它可以根据变量的值推断出变量的类型。在这个例子中,编译器会自动推断出x的类型是i32

2,变量的可变性

在Rust中,变量默认是不可变的。这是一种保障数据安全的方式。如果试图改变一个不可变变量的值,编译器会报错。

let x = 5;
x = 6; // 编译错误:不能赋值给不可变变量

如果需要改变变量的值,需要在定义变量时使用mut关键字,表示这个变量是可变的。

let mut x = 5;
x = 6; // 这是合法的

在这个例子中,x是一个可变变量,可以改变它的值。

3,变量的隐藏

在Rust中,可以定义一个新的变量来隐藏旧的变量。这被称为变量的隐藏。

let x = 5;
let x = x + 1; // 隐藏旧的x,定义一个新的x

在这个例子中,第二个let语句定义了一个新的变量x,并隐藏了旧的变量x。新的变量x的值是旧的变量x的值加1。


二、数据类型

Rust是一种静态类型语言,这意味着在编译时就必须知道所有变量的类型。Rust的数据类型主要分为两大类:标量(Scalar)和复合(Compound)。

1,标量类型

标量类型代表一个单一的值,Rust有四种基本的标量类型:整型,浮点型,布尔型,和字符型。

  1. 整型
    整型是一种数字类型,可以是有符号的(i8, i16, i32, i64, i128 和 isize)或无符号的(u8, u16, u32, u64, u128 和 usize)。每一个变量后面的数字代表该变量占用的位数。例如,i32类型的整数占用32位,i64占用64位。isize和usize类型依赖运行程序的计算机架构:64位架构上它们是64位的, 32位架构上它们是32位的。
let x: i32 = 5; // 有符号整型
let y: u32 = 5; // 无符号整型
  1. 浮点型
    Rust的浮点数类型是f32 和 f64,分别占32位和64位。默认类型是f64,因为在现代CPU中,它几乎与f32一样快,但精度更高。
let x = 2.0; // f64
let y: f32 = 3.0; // f32
  1. 布尔型
    布尔类型有两个可能的值:true 和 false。Rust中布尔类型的大小为一位。
let t = true;
let f: bool = false; // 显式指定类型
  1. 字符型
    Rust的char类型代表了一个Unicode标量值,这意味着它可以比ASCII表表示更多的内容。char类型的大小为四个字节,并且用单引号指定。
let c = 'z';
let z = 'ℤ';
let heart_eyed_cat = '😻';

2,复合类型

复合类型可以将多个值组合成一个类型。Rust有两个原生的复合类型:元组(tuple)和数组(array)。

  1. 元组类型
    元组是一个将多个其他类型的值组合进一个复合类型的主要方式。元组长度固定:一旦声明,其长度不能增大或缩小。
let tup: (i32, f64, u8) = (500, 6.4, 1);
  1. 数组类型
    对于每个元素类型相同的情况,Rust提供了数组类型。与元组不同,数组的长度在编译时就必须是固定的,不能动态改变。
let a = [1, 2, 3, 4, 5];
let months = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"];

三,运算符

Rust语言提供了一系列的运算符,包括算术运算符,比较运算符,逻辑运算符,位运算符,赋值运算符等。这些运算符在编程中起着至关重要的作用,用于执行各种计算和逻辑操作。下面将对这些运算符进行详细的介绍,并提供相应的代码示例。

1,算术运算符

Rust支持基本的算术运算符,包括加法(+), 减法(-), 乘法(*), 除法(/), 取余(%):

let a = 10;
let b = 3;let sum = a + b; // 加法
println!("Sum: {}", sum); // 输出:13let difference = a - b; // 减法
println!("Difference: {}", difference); // 输出:7let product = a * b; // 乘法
println!("Product: {}", product); // 输出:30let quotient = a / b; // 除法
println!("Quotient: {}", quotient); // 输出:3let remainder = a % b; // 取余
println!("Remainder: {}", remainder); // 输出:1

2,比较运算符

比较运算符用于比较两个值,包括等于(==), 不等于(!=), 大于(>), 小于(<), 大于等于(>=), 小于等于(<=):

let a = 10;
let b = 20;println!("a == b: {}", a == b); // 输出:false
println!("a != b: {}", a != b); // 输出:true
println!("a > b: {}", a > b); // 输出:false
println!("a < b: {}", a < b); // 输出:true
println!("a >= b: {}", a >= b); // 输出:false
println!("a <= b: {}", a <= b); // 输出:true

3,逻辑运算符

逻辑运算符用于组合多个条件,包括逻辑与(&&), 逻辑或(||), 逻辑非(!):

let a = true;
let b = false;println!("a && b: {}", a && b); // 输出:false
println!("a || b: {}", a || b); // 输出:true
println!("!a: {}", !a); // 输出:false

4,位运算符

位运算符用于操作整数的二进制位,包括位与(&), 位或(|), 位异或(^), 左移(<<), 右移(>>):

let a = 0b_0011_1100; // 60
let b = 0b_0000_1101; // 13println!("a & b: {}", a & b); // 输出:12
println!("a | b: {}", a | b); // 输出:61
println!("a ^ b: {}", a ^ b); // 输出:49
println!("a << 2: {}", a << 2); // 输出:240
println!("a >> 2: {}", a >> 2); // 输出:15

5,赋值运算符

赋值运算符用于给变量赋值,包括等号(=), 加等(+=), 减等(-=), 乘等(*=), 除等(/=), 取余等(%=), 位与等(&=), 位或等(|=), 位异或等(^=), 左移等(<<=), 右移等(>>=):

let mut a = 10;a += 5; // a = a + 5
println!("a: {}", a); // 输出:15a -= 2; // a = a - 2
println!("a: {}", a); // 输出:13a *= 3; // a = a * 3
println!("a: {}", a); // 输出:39a /= 3; // a = a / 3
println!("a: {}", a); // 输出:13a %= 5; // a = a % 5
println!("a: {}", a); // 输出:3a &= 2; // a = a & 2
println!("a: {}", a); // 输出:2a |= 1; // a = a | 1
println!("a: {}", a); // 输出:3a ^= 1; // a = a ^ 1
println!("a: {}", a); // 输出:2a <<= 2; // a = a << 2
println!("a: {}", a); // 输出:8a >>= 1; // a = a >> 1
println!("a: {}", a); // 输出:4

四、控制流

控制流是编程中的基本概念,它决定了代码的执行顺序。在Rust中,控制流主要包括条件语句和循环语句。

1,条件语句

条件语句是根据特定条件来决定执行哪段代码。在Rust中,主要使用ifelse关键字来创建条件语句。

  1. if语句
    if语句用于测试某个条件是否满足,如果满足,则执行相应的代码块。以下是一个简单的例子:
let number = 7;if number < 5 {println!("condition was true");
} else {println!("condition was false");
}

在这个例子中,number < 5是一个条件表达式,它的结果是一个布尔值。如果这个值为true,则执行if后面的代码块,否则执行else后面的代码块。

  1. else if语句
    else if语句用于测试多个条件。如果if语句的条件不满足,那么就会测试else if语句的条件,如果else if语句的条件满足,就执行相应的代码块,否则继续测试下一个else if语句的条件,如果所有的else if语句的条件都不满足,就执行else后面的代码块。
let number = 6;if number % 4 == 0 {println!("number is divisible by 4");
} else if number % 3 == 0 {println!("number is divisible by 3");
} else if number % 2 == 0 {println!("number is divisible by 2");
} else {println!("number is not divisible by 4, 3, or 2");
}

2,循环语句

循环语句用于重复执行某段代码,直到满足特定的条件。在Rust中,主要使用loopwhilefor关键字来创建循环语句。

  1. loop语句
    loop语句用于创建无限循环,也就是说,它会一直重复执行相应的代码块,直到显式地使用break关键字来退出循环。
let mut counter = 0;loop {counter += 1;if counter == 10 {break;}
}

在这个例子中,loop语句会一直重复执行,直到counter的值等于10,然后使用break关键字退出循环。

  1. while语句
    while语句用于创建条件循环,也就是说,它会一直重复执行相应的代码块,直到条件表达式的结果为false
let mut number = 3;while number != 0 {println!("{}!", number);number -= 1;
}println!("LIFTOFF!!!");

在这个例子中,while语句会一直重复执行,直到number的值等于0,然后退出循环。

  1. for语句
    for语句用于遍历一个集合的所有元素。在Rust中,可以使用for语句和in关键字来遍历一个范围,一个迭代器,或者一个数组。
let a = [10, 20, 30, 40, 50];for element in a.iter() {println!("the value is: {}", element);
}

在这个例子中,for语句遍历数组a的所有元素,并打印每个元素的值。


总结

本章节详细介绍了Rust的基础语法,包括变量,数据类型,运算符,以及控制流。理解这些基础知识是学习Rust的重要步骤,希望这些内容能帮助理解和掌握Rust的基础语法。

相关文章:

【零基础学Rust | 基础系列 | 基础语法】变量,数据类型,运算符,控制流

文章目录 简介&#xff1a;一&#xff0c;变量1&#xff0c;变量的定义2&#xff0c;变量的可变性3&#xff0c;变量的隐藏 二、数据类型1&#xff0c;标量类型2&#xff0c;复合类型 三&#xff0c;运算符1&#xff0c;算术运算符2&#xff0c;比较运算符3&#xff0c;逻辑运算…...

运输层---概述

目录 运输层主要内容一.概述和传输层服务1.1 概述1.2 传输服务和协议1.3 传输层 vs. 网络层1.4 Internet传输层协议 二. 多路复用与多路分解&#xff08;解复用&#xff09;2.1 概述2.2 无连接与面向连接的多路分解&#xff08;解复用&#xff09;2.3面向连接的多路复用*2.4 We…...

高速公路巡检无人机,为何成为公路巡检的主流工具

随着无人机技术的不断发展&#xff0c;无人机越来越多地应用于各个领域。其中&#xff0c;在高速公路领域&#xff0c;高速公路巡检无人机已成为公路巡检的得力助手。高速公路巡检无人机之所以能够成为公路巡检中的主流工具&#xff0c;主要是因为其具备以下三大特性。 一、高速…...

仓库管理系统有哪些功能,如何对仓库进行有效管理

阅读本文&#xff0c;您可以了解&#xff1a;1、仓库管理系统有哪些功能&#xff1b;2、如何对仓库进行有效管理。 仓库是制造业的开端&#xff0c;原材料的领料开始。企业的仓库管理是涉及企业生产、企业资金流和企业的经营风险的关键环节。在众多的工业企业、制造型企业、贸…...

Java 比Automic更高效的累加器

1、 java常见的原子类 类 Atomiclnteger、AtomicIntegerArray、AtomicIntegerFieldUpdater、AtomicLongArray、 AtomicLongFieldUpdater、AtomicReference、AtomicReferenceArray 和 AtomicReference- FieldUpdater 常见的原子类使用方法 使用 AtomicReference 来创建一个原…...

antDv table组件滚动截图方法的实现

在开发中经常遇到table内容过多产生滚动的场景&#xff0c;正常情况下不产生滚动进行截图就很好实现&#xff0c;一旦产生滚动就会变得有点棘手。 下面分两种场景阐述解决的方法过程 场景一&#xff1a;右侧不固定列的情况 场景二&#xff1a;右侧固定列的情况 场景一 打开…...

JavaSE【抽象类和接口】(抽象类、接口、实现多个接口、接口的继承)

一、抽象类 在 Java 中&#xff0c;一个类如果被 abstract 修饰称为抽象类&#xff0c;抽象类中被 abstract 修饰的方法称为抽象方法&#xff0c;抽象方法不用 给出具体的实现体。 1.语法 // 抽象类&#xff1a;被 abstract 修饰的类 public abstract class Shape { …...

微信小程序如何跳转H5页面

1、登录微信公众后台&#xff0c;进入【开发->开发管理->业务域名】&#xff0c;点击修改。 2、首先请下载校验文件&#xff0c;并将文件放置在域名根目录下。 我是把文件放在nginx主机的data目录下&#xff0c;然后通过增加nginx.config配置&#xff0c;重启nginx后可…...

C++(20):bit_cast

C++20之前如果想对不同的指针之间做类型转换需要通过reinterpret_cast,对于整数与指针之前的转换也需要通过reinterpret_cast: C++:reinterpret_cast_c++ reparant_cast_风静如云的博客-CSDN博客 但是reinterpret_cast的缺点是不同的编译环境下,无法包装转型的安全一致。 …...

STM32 低功耗-停止模式

STM32 停止模式 文章目录 STM32 停止模式第1章 低功耗模式简介第2章 停止模式简介2.1 进入停止模式2.1 退出停止模式 第3章 停止模式程序部分总结 第1章 低功耗模式简介 在 STM32 的正常工作中&#xff0c;具有四种工作模式&#xff1a;运行、睡眠、停止以及待机模式。 在系统…...

Hutool中 常用的工具类和方法

文章目录 日期时间工具类 DateUtil日期时间对象-DateTime类型转换工具类 Convert字符串工具类 StrUtil数字处理工具类 NumberUtilJavaBean的工具类 BeanUtil集合操作的工具类 CollUtilMap操作工具类 MapUtil数组工具-ArrayUtil唯一ID工具-IdUtilIO工具类-IoUtil加密解密工具类 …...

K8s(健康检查+滚动更新+优雅停机+弹性伸缩+Prometheus监控+配置分离)

前言 快速配置请直接跳转至汇总配置 K8s SpringBoot实现零宕机发布&#xff1a;健康检查滚动更新优雅停机弹性伸缩Prometheus监控配置分离&#xff08;镜像复用&#xff09; 配置 健康检查 健康检查类型&#xff1a;就绪探针&#xff08;readiness&#xff09; 存活探针&am…...

Django学习记录:使用ORM操作MySQL数据库并完成数据的增删改查

Django学习记录&#xff1a;使用ORM操作MySQL数据库并完成数据的增删改查 数据库操作 MySQL数据库pymysql Django开发操作数据库更简单&#xff0c;内部提供了ORM框架。 安装第三方模块 pip install mysqlclientORM可以做的事&#xff1a; 1、创建、修改、删除数据库中的…...

React Hooks 中的 useEffect(副作用)

useEffect 是什么&#xff1f; useEffect 是一个 React Hook&#xff0c;它允许你将组件与外部系统同步 当我们在 React 中使用 useEffect 这个 Hook 时&#xff0c;实际上是在告诉 React 在特定情况下执行我们定义的副作用函数。这种副作用函数可以处理一些与组件渲染结果无关…...

[CKA]考试之持久化存储卷PersistentVolume

由于最新的CKA考试改版&#xff0c;不允许存储书签&#xff0c;本博客致力怎么一步步从官网把答案找到&#xff0c;如何修改把题做对&#xff0c;下面开始我们的 CKA之旅 题目为&#xff1a; Task 创建一个pv&#xff0c;名字为app-config&#xff0c;大小为2Gi&#xff0c;…...

基于LLM的SQL应用程序开发实战(一)

基于LLM的SQL应用程序开发实战(一) 16.1 SQL on LLMs应用程序初始化 本节主要从案例代码的角度切入,探索ChatGPT以及大模型,尤其是从生产环境的视角,来思考具体的最佳实践。本节主要跟大家谈的是,在LangChain这样一个框架下,我们使用GPT-3.5或者GPT-4大模型,同时使用第…...

如何批量实现多行合并后居中

思路&#xff1a; 1.先填充数据 2.数据分类统计制作格式 3.格式刷刷制作出的格式 1.填充数据 思路&#xff1a;选中&#xff0c;F5定位空值&#xff0c;&#xff0c;⬆&#xff08;键盘上的上下左右哪里的上键&#xff09;&#xff0c;按住Ctrl然后按Enter。 2.数据分类统计…...

【深度学习_TensorFlow】手写数字识别

写在前面 到这里为止&#xff0c;我们已经学习完张量的常用操作方法&#xff0c;已具备实现大部分神经网络技术的基础储备了。这一章节我们将开启神经网络的学习&#xff0c;然而并不需要像学习前面那样了解大量的张量操作&#xff0c;而是将重点转向理解概念知识&#xff0c;…...

antv/l7地图,鼠标滚动,页面正常滑动-- 我们忽略的deltaY

背景 在官网项目中&#xff0c;需要使用一个地图&#xff0c;展示产品的分布区域及数量。希望的交互是&#xff0c;鼠标放上标点&#xff0c;tooltip展示地点和数量等信息。鼠标滚动&#xff0c;则页面随着滚动。但是鼠标事件是被地图代理了的&#xff0c;鼠标滚动意味着地图的…...

再续AM335x经典,米尔TI AM62x核心板上市,赋能新一代HMI

近十年来&#xff0c;AM335x芯片作为TI经典工业MPU产品&#xff0c;在工业处理器市场占据主流地位&#xff0c;其凭借GPMC高速并口、PRU协处理器等个性化硬件资源&#xff0c;在工业控制、能源电力、轨道交通、智慧医疗等领域广受用户欢迎。随着信息技术的快速发展&#xff0c;…...

7.4.分块查找

一.分块查找的算法思想&#xff1a; 1.实例&#xff1a; 以上述图片的顺序表为例&#xff0c; 该顺序表的数据元素从整体来看是乱序的&#xff0c;但如果把这些数据元素分成一块一块的小区间&#xff0c; 第一个区间[0,1]索引上的数据元素都是小于等于10的&#xff0c; 第二…...

Admin.Net中的消息通信SignalR解释

定义集线器接口 IOnlineUserHub public interface IOnlineUserHub {/// 在线用户列表Task OnlineUserList(OnlineUserList context);/// 强制下线Task ForceOffline(object context);/// 发布站内消息Task PublicNotice(SysNotice context);/// 接收消息Task ReceiveMessage(…...

数据链路层的主要功能是什么

数据链路层&#xff08;OSI模型第2层&#xff09;的核心功能是在相邻网络节点&#xff08;如交换机、主机&#xff09;间提供可靠的数据帧传输服务&#xff0c;主要职责包括&#xff1a; &#x1f511; 核心功能详解&#xff1a; 帧封装与解封装 封装&#xff1a; 将网络层下发…...

C# SqlSugar:依赖注入与仓储模式实践

C# SqlSugar&#xff1a;依赖注入与仓储模式实践 在 C# 的应用开发中&#xff0c;数据库操作是必不可少的环节。为了让数据访问层更加简洁、高效且易于维护&#xff0c;许多开发者会选择成熟的 ORM&#xff08;对象关系映射&#xff09;框架&#xff0c;SqlSugar 就是其中备受…...

laravel8+vue3.0+element-plus搭建方法

创建 laravel8 项目 composer create-project --prefer-dist laravel/laravel laravel8 8.* 安装 laravel/ui composer require laravel/ui 修改 package.json 文件 "devDependencies": {"vue/compiler-sfc": "^3.0.7","axios": …...

Springboot社区养老保险系统小程序

一、前言 随着我国经济迅速发展&#xff0c;人们对手机的需求越来越大&#xff0c;各种手机软件也都在被广泛应用&#xff0c;但是对于手机进行数据信息管理&#xff0c;对于手机的各种软件也是备受用户的喜爱&#xff0c;社区养老保险系统小程序被用户普遍使用&#xff0c;为方…...

LINUX 69 FTP 客服管理系统 man 5 /etc/vsftpd/vsftpd.conf

FTP 客服管理系统 实现kefu123登录&#xff0c;不允许匿名访问&#xff0c;kefu只能访问/data/kefu目录&#xff0c;不能查看其他目录 创建账号密码 useradd kefu echo 123|passwd -stdin kefu [rootcode caozx26420]# echo 123|passwd --stdin kefu 更改用户 kefu 的密码…...

DingDing机器人群消息推送

文章目录 1 新建机器人2 API文档说明3 代码编写 1 新建机器人 点击群设置 下滑到群管理的机器人&#xff0c;点击进入 添加机器人 选择自定义Webhook服务 点击添加 设置安全设置&#xff0c;详见说明文档 成功后&#xff0c;记录Webhook 2 API文档说明 点击设置说明 查看自…...

系统掌握PyTorch:图解张量、Autograd、DataLoader、nn.Module与实战模型

本文较长&#xff0c;建议点赞收藏&#xff0c;以免遗失。更多AI大模型应用开发学习视频及资料&#xff0c;尽在聚客AI学院。 本文通过代码驱动的方式&#xff0c;系统讲解PyTorch核心概念和实战技巧&#xff0c;涵盖张量操作、自动微分、数据加载、模型构建和训练全流程&#…...

C++实现分布式网络通信框架RPC(2)——rpc发布端

有了上篇文章的项目的基本知识的了解&#xff0c;现在我们就开始构建项目。 目录 一、构建工程目录 二、本地服务发布成RPC服务 2.1理解RPC发布 2.2实现 三、Mprpc框架的基础类设计 3.1框架的初始化类 MprpcApplication 代码实现 3.2读取配置文件类 MprpcConfig 代码实现…...