[初学rust] 02_rust 中的变量和数据类型

rust 中的变量和数据类型

变量

变量声明

  • 使用let来声明变量
  • 并且必须指定类型
  • 默认定义的变量都是i32类型
  • 使用 mut关键字(mutable缩写),来指定变量为可变的
    let a = 1;println!("a is {}", a);let b = 2i32;let c = 3_i32;let mut d = 4;println!("b is {}, c is {}, d is {}", b, c, d);

使用下划线开头忽略未使用的变量

命名

rust命名规范

变量绑定

  • 使用=来进行变量的绑定
  • 变量默认是不能重新绑定的
  • 不能在一个表达式中同时进行多次绑定
  • 如果是不可变的,则必须先声明后赋值
let a = 1;
let b = 2;
a = b; // error[E0384]: re-assignment of immutable variable `a`

变量可变性

  • 默认情况下,变量是不可变的
  • 使用mut关键字来指定变量为可变的
    let mut h = 1;h = 2;println!("h is {}", h);

好处:

  • 可变变量最大的好处就是使用上的灵活性和性能上的提升
  • 不可变可以带来安全性,但是丧失了灵活性和性能

变量解构

这个类似于C++的结构化绑定

    let (x, y) = (1, 2);println!("x is {}, y is {}", x, y);

常量

  • 使用const关键字来声明一个常量
  • 必须指定类型
  • 不能使用mut关键字
  • 常量的值必须在编译时就已知
const MAX_POINTS: u32 = 100_000;
println!("MAX_POINTS is {}", MAX_POINTS);

变量遮蔽(shadowing)

和C++不同的是,同作用域下rust也会有变量遮蔽

let x = 5;
let x = x+1;

这种算是变量不太灵活的补丁

基本类型

  • 数值类型: 有符号整数 (i8, i16, i32, i64, isize)、 无符号整数 (u8, u16, u32, u64, usize) 、浮点数 (f32, f64)、以及有理数、复数
  • 字符串:字符串字面量和字符串切片 &str
  • 布尔类型: true和false
  • 字符类型: 表示单个 Unicode 字符,存储为 4 个字节
  • 单元类型: 即 () ,其唯一的值也是 ()

类型推导与标注

推导和C++大致一致
标注则是在变量处添加变量类型

let gus:i32 = 1; // i32 就是标注

整数类型

长度有符号类型无符号类型
8 位i8u8
16 位i16u16
32 位i32u32
64 位i64u64
128 位i128u128
视架构而定isizeusize

类型定义的形式统一为:有无符号 + 类型大小(位数)。

  • 无符号数表示数字只能取正数和0
  • 有符号则表示数字可以取正数、负数还有0。

isize 和 usize 类型取决于程序运行的计算机 CPU 类型
字面量书写:

数字字面量示例
十进制98_222
十六进制0xff
八进制0o77
二进制0b1111_0000
字节 (仅限于 u8)b’A’

上面rust除了和python使用了 _这种更容易读的助记符之外,其他的前缀和C一样

溢出

和C一样,Rust也有整数溢出的问题。
只是在debug模式下,会检测这个溢出,release不检测

如何处理:使用标准库提供的方法

    let a: u8 = 255;let b = a.wrapping_add(20);println!("a is {}, b is {}", a, b);

浮点数类型

  • f32和f64分别表示单精度和双精度浮点数。
  • 默认浮点为 f64
  • 默认情况下,Rust 使用 IEEE-754 标准来表示浮点数。

浮点数的问题,C到rust是一致的:

  • 浮点数不能精确表示无限多的小数
  • 浮点数只是数字的近似值
  • 浮点数无法计算相等

使用准则:

  • 避免在浮点数上测试相等性
  • 不要使用浮点数来表示货币金额

NaN

  • 表示未定义的结果
  • 所有跟 NaN交互的操作,都会返回一个NaN
  • 使用is_nan()方法来判断一个浮点数是否为NaN
    这里和js类似
let a = f64::NAN;
println!("a is {}", a);
assert!(a.is_nan()); 

运算

加减乘除取模

  • 类型之间不能做运算

位运算

  • 使用&进行按位与操作
  • 使用|进行按位或操作
  • 使用^进行按位异或操作
  • 使用!进行按位非
  • 使用<<进行左移操作(右位补0)
  • 使用>>进行右移操作(正数补0,负数补1)
    这里和C++一致,但是rust对于整数的位运算也有了限制
    let a:i8 = 0b0011_1111;let b:i8 = 0b0001_1111;println!("(a & b) value is {}", (a & b));println!("(a | b) value is {}", (a | b));println!("(a ^ b) value is {}", (a ^ b));println!("(a << 2) value is {}", (a << 2));println!("(a >> 2) value is {}", (a >> 2));println!("(!b) value is {}", (!b));

序列

Rust提供简单的方式生成序列
序列只允许用于数字或字符类型

for i in 1..5 { //左闭右开[1, 5)println!("{}", i);
}
for i in 1..=5 { //左闭右闭[1, 5]println!("{}", i);
}

使用 As 进行 类型转换

  • 使用as关键字来强制转换
  • 如果不能转换,则会报错
    TODO

有理数和复数

这个rust标准库还没有,需要自己引包

字符类型 char

  • 字符类型占一个 Unicode Scalar Value(标量值),就是4个字节
  • 使用单引号括起来的 是字符
let x = '中';
println!("字符'中'占用了{}字节的内存大小",std::mem::size_of_val(&x));

布尔

true 和 false,布尔值占用内存的大小为 1 个字节

let b = true;
let f: bool = false;
if !f {println!("f {}",std::mem::size_of_val(&f));
}

单元类型

唯一的值是 ()
表达式返回值如果没有,rust隐式返回()

语句和表达式

rust 中 语句 和表达式是有明显含义的,应该是在解析阶段,语句作为顶层解析
表达式作为语句中的元素被解析

  • 语句默认后面加个分号
  • 表达式有返回值
  • 表达式表现和C++大致一致,调用函数,加减乘除之类的都叫表达式

总结

  • 变量的类型是在编译期确定的,不能改变。
  • 类型之间不能进行运算,除非使用as关键字来强制转换。
  • 数据类型种类和C++差不多
  • Rust的数据类型是有method的,可以直接调用

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

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

相关文章

如何使用Shortemall自动扫描URL短链接中的隐藏内容

关于Shortemall Shortemall是一款针对URL地址安全与Web内容安全的强大工具&#xff0c;该工具基于纯Python开发&#xff0c;专为Web安全方向设计&#xff0c;可以帮助广大研究人员以自动化的形式扫描URL短链接中的隐藏内容。 Shortemall的全名为ShortEm All&#xff0c;该工具…

【大比武05】多方主体参与下的工程档案资料数据化实现路径探究

关注我们 - 数字罗塞塔计划 - 数据化&#xff0c;是以数据为基础&#xff0c;以信息技术为手段&#xff0c;以数据分析为切入点&#xff0c;通过数据发现并分析问题&#xff0c;实现科学决策。而工程档案资料的数据化是实现工程全生命周期管理智慧化&#xff0c;发挥数据生产…

机器学习1——线性回归、误差推导

有监督——分类、回归 一、线性回归 对于一个线性方程&#xff0c;没办法拟合所有的数据点&#xff0c;但是要尽可能的覆盖尽可能多的点。 在下面的图中&#xff0c;x01。添加这一项的目的是&#xff1a;将数据矩阵补全&#xff08;比如年龄是x1、工资是x2&#xff0c;那么x0手…

“等保测评实施策略:保障企业信息安全合规“

等保测评&#xff0c;即网络安全等级保护测评&#xff0c;是企业保障信息安全合规的重要实施策略。以下是企业实施等保测评的一些关键策略&#xff1a; 理解等保测评的重要性&#xff1a; 等保测评有助于企业识别和评价信息系统的安全性能&#xff0c;提供改进建议&#xff0c;…

可重构柔性装配产线:为工业制造领域注入了新的活力

随着科技的飞速发展&#xff0c;智能制造正逐渐成为引领工业革新的重要力量。在这一浪潮中&#xff0c;可重构柔性装配产线以其独特的技术优势和创新理念&#xff0c;为工业制造领域注入了新的活力&#xff0c;开启了创新驱动的智能制造新篇章。 可重构柔性装配产线是基于富唯智…

代码随想录算法训练营第四十六天|139.单词拆分,多重背包,背包问题总结

目录 139.单词拆分思路代码 多重背包思路代码 背包问题总结 139.单词拆分 题目链接&#xff1a;704. 二分查找 文档讲解&#xff1a;代码随想录 视频讲解&#xff1a;动态规划之完全背包&#xff0c;你的背包如何装满&#xff1f;| LeetCode&#xff1a;139.单词拆分 思路 dp数…

面试常见手撕代码

目录 1.线程池 and 数据库连接池 2.生产者&#xff0c;消费者问题 3.排序算法 1.线程池 and 数据库连接池 线程池 #include <iostream> #include <vector> #include <queue> #include <thread> #include <mutex> #include <condition_va…

2024第二届智慧教育和人类发展国际会议(ICSEHD2024)

2024第二届智慧教育和人类发展国际会议(ICSEHD2024) 会议简介 智慧教育对于提升教育质量、促进教育公平、推动教育现代化和数字化转型、培养创新人才以及推动教育理论的发展都具有重要的意义&#xff0c;对人类发展产生着深远的影响&#xff0c;人类发展是智慧教育的最终目的…

易图讯科技数字武装三维电子沙盘

深圳易图讯科技(www.3dgis.top)集成了高清卫星影像、地形数据、实景三维模型、基干民兵、普通民兵、重要目标、兵要地志、企业潜力 、行业潜力 、社会组织潜力 、特种装备器材潜力、敌情数据、现场环境数据、物联感知信息&#xff0c;构建一体化的数字孪生空间&#xff0c;实现…

backtrader笔记摘录

策略 在next()里接收当前行情&#xff0c;作出买卖判断&#xff0c;通过buy()和sell()函数下单。 信号 用来通知买和卖&#xff0c;有空头信号、多头信号、空多头信号之分。 指示器 Indicators are always instantiated during __init__ in the StrategyIndicator values …

美港通正规股票炒股市场又一新能车火了!上市首日,大涨34%

查查配大家早上好!昨夜今晨,又有很多大事发生! 美三大股指涨跌不一,美债收益率集体收涨;OpenAI或推AI语音助手;来自中国的新能源车品牌——极氪在美股上市,首日大涨超34%。 美港通证券以其专业的服务和较低的管理费用在市场中受到不少关注。该平台提供了实盘交易、止盈止损、…

element ui输入框后面带输入的字符数量

使用el-input的属性&#xff1a; maxlength&#xff1a;最长字符限制&#xff1b; show-word-limit&#xff1a;显示输入字符数量&#xff1b; 例&#xff1a; <el-input v-model"title" placeholder"请输入名称" maxlength"200" show-wor…

【Node.js】如何使用 Express.js 和 TypeScript 构建 CRUD API

如何使用 Express.js 和 TypeScript 构建 CRUD API 作者&#xff1a;Racheal Kuranchie 来源&#xff1a;https://medium.com/rachealkuranchie/how-to-build-a-crud-api-with-express-js-and-typescript-21c7c66e5296 文章目录 如何使用 Express.js 和 TypeScript 构建 CRUD A…

面试 Java 并发编程八股文十问十答第十六期

面试 Java 并发编程八股文十问十答第十六期 作者&#xff1a;程序员小白条&#xff0c;个人博客 相信看了本文后&#xff0c;对你的面试是有一定帮助的&#xff01;关注专栏后就能收到持续更新&#xff01; ⭐点赞⭐收藏⭐不迷路&#xff01;⭐ 1&#xff09;final 和可以保证…

woffice– 内部网和外部网WordPress高端资讯主题

下载地址&#xff1a;https://m.gx.cn/site/3046.html 完全灵活&#xff0c;与最新的WordPress品牌兼容 翻译语言超过15种 使用最新技术设计快速web应用程序 所有这些都以谷歌材料设计为灵感&#xff0c;采用易于定制的设计&#xff0c;给人一种优美的现代感和易于导航的用户…

ERROR 1045 (28000) Access denied for user ‘root‘@‘IP‘(using password YES/NO)

查看权限 要查看MySQL用户的权限&#xff0c;您可以使用SHOW GRANTS语句。这将列出用户的权限&#xff0c;包括授予的权限和可以授予其他用户的权限。 以下是查看当前用户权限的SQL命令&#xff1a; SHOW GRANTS; 如果您想查看特定用户的权限&#xff0c;可以使用以下命令&…

让 CloudFlare 支持 Brotli 压缩算法 11 级压缩比,更节流!

站长们应该都知道 Brotli 压缩算法吧&#xff0c;这是一种通用的无损压缩算法。它结合使用 LZ77 算法的一个现代变体&#xff08;Lempel-Ziv 编码&#xff09;、霍夫曼编码和二阶上下文建模来压缩数据&#xff0c;提供了与当前最佳通用压缩方法相媲美的压缩比。2015 年 9 月谷歌…

笔记-跨域方式实现原理

websocket Websocket是HTML5的一个持久化的协议&#xff0c;它实现了浏览器与服务器的全双工通信&#xff0c;同时也是跨域的一种解决方案。WebSocket和HTTP都是应用层协议&#xff0c;都基于 TCP 协议。但是 WebSocket 是一种双向通信协议&#xff0c;在建立连接之后&#xff…

51-50 两万字长文解读ControlNet论文和代码,以及自定义模型训练和图片精确控制生成实验

今天咱们来看 ICCV2023 最佳论文Adding Conditional Control to Text-to-Image Diffusion Models&#xff0c;又称为ControlNet。提到图像生成Finetuning工程方法&#xff0c;有Textual inversion、DreamBooth、LoRA、T2I-Adapter以及ControlNet&#xff0c;其中最著名的当属Co…

Jupyter配置

一、修改Jupyter打开界面 &#xff08;1&#xff09;打开【Anaconda Prompt】&#xff0c;输入【jupyter notebook --generate-config】命令 从运行结果可知【jupyter_notebook_config.py】的位置 &#xff08;2&#xff09;使用【记事本】打开 找到# c.NotebookApp.noteb…