Rust基本类型

数值类型

整数类型
  • 无符号整数只能取正数和0,有符号整数可以取正数负数和0。
  • isize和usize类型取决于程序运行的计算机CPU类型,若CPU是32位的,则这两个类型是32位的,若CPU是64位的,则它们是64位的。
  • rust整型 默认使用 i32,例如 let i = 1; 那 i 就是 i32类型。
  • 整型溢出
    • 假设有一个 u8 ,它可以存放从 0 到 255 的值。那么当你将其修改为范围之外的值,比如 256,则会发生整型溢出。
    • debug模式 编译下,若存在整形溢出,则程序在编译时因错误而退出。
    • 当使用 --release 参数进行release 模式构建时,rust检测整型溢出,当检测到整型溢出时,rust会按照补码循环溢出,例如在 u8 情况下,256变成0,257变成1。程序不会因错误而退出,但是可能不是你所期望的值。
    • 要显式的处理可能的溢出,可以使用标准库针对原始数字类型提供的这些方法:
      • 使用wrapping_*方法在所有模式下都按照补码循环溢出规则处理。例如 wrapping_add
      • 如果使用checked_*方法时发生溢出,则返回 None 值
      • 使用overflowing_*方法返回该值和一个指示是否存在溢出的布尔值
      • 使用saturating_*方法,可以限定计算后的结果不超过目标类型的最大值或低于最小值
      • 以下是一个示例代码,然后cargo run 命令运行代码如下
fn main() {let a: i32 = 2147483647;  //整型溢出let b: i32 = 10;//wrapping_addlet wrapping_result = a.wrapping_add(b);  //简单的相加操作,a+bprintln!("Wrapping Add Result: {}", wrapping_result);//checked_add··············match a.checked_add(b) {Some(result) => println!("Checked Add Result: {}", result),None => println!("Checked Add Overflowed"),}// overflowing_addlet (overflowing_result, did_overflow) = a.overflowing_add(b);println!("Overflowing Add Result: {}", overflowing_result);println!("Did Overflow: {}", did_overflow);// saturating_addlet saturating_result = a.saturating_add(b);println!("Saturating Add Result: {}", saturating_result); 
}

在这里插入图片描述

浮点类型
  • Rust 中浮点类型数字有两种基本类型: f32 和 f64,分别为 32 位(单精度)和 64 位(双精度)大小。默认浮点类型是 f64,在现代的 CPU 中它的速度与 f32 几乎相同,但精度更高。
  • 但是浮点数是我们想要数字的近似表达,因此需要避免在浮点数上测试相等性,当结果在数学上可能存在未定义时,需要格外的小心。
NaN
  • 对于数学上未定义的结果会产生一个特殊的结果NaN,所有跟NaN交互的操作都会返回一个NaN,而且NaN不能用来比较,可以使用is_nan()等方法来判断一个数值是否是NaN,如下
fn main() {let x = (-42.0_f32).sqrt();if x.is_nan() {println!("未定义的数学行为")}
}
数字运算

Rust 支持所有数字类型的基本数学运算:加法、减法、乘法、除法和取模运算。跟正常的数学运算一样。

位运算
  • rust位运算基本上和其它语言一样。
  • 示例代码
fn main() {// 二进制为00000010let a:i32 = 2;// 二进制为00000011let b:i32 = 3;println!("(a & b) value is {}", a & b);println!("(a | b) value is {}", a | b);println!("(a ^ b) value is {}", a ^ b);println!("(!b) value is {} ", !b);println!("(a << b) value is {}", a << b);println!("(a >> b) value is {}", a >> b);let mut a = a;// 注意这些计算符除了!之外都可以加上=进行赋值 (因为!=要用来判断不等于)a <<= b;println!("(a << b) value is {}", a);
}

运行结果如下
在这里插入图片描述

序列
  • rust提供了非常简洁的方式来生成连续的数值,例如1..5,生成从1到4的连续数字,不包含5,常用于循环当中,序列只允许用于数字或字符类型,例如:
fn main() {for i in 1..=5 {println!("{}",i);}
}

运行如下

有理数和复数
  • rust标准库中不包含有理数和复数,但社区已经开发出高质量的rust数值库,可以按以下步骤来引入num库:
    • 创建新工程cargo new complex-num 然后 cd complex-num
    • Cargo.toml中的[dependencies]下添加一行num = "0.4.0"
    • src/main.rs文件中的main函数替换为下面的代码
    • 运行cargo run
use num::complex::Complex;fn main() {let a = Complex { re: 2.1, im: -1.2};let b = Complex::new(11.1, 22.2);let result = a + b;println("{} + {}i", result.re, result.im)
}

字符类型(char)

  • Rust语言中的字符不仅仅是ASCII,所有的Unicode值都可以作为Rust字符,包括单个的中文、日文、韩文、emoji表情符号等等都是合法的字符类型。由于Unicode都是四个字节编码,因此字符类型也是占用四个字节。

布尔类型(bool)

  • Rust中的布尔类型有true和false两个可能的值,站内存大小为一个字节。使用布尔类型的场景主要在于流程控制。

单元类型

  • 单元类型就是(),唯一的值也是(),例如fn main(),main函数就是返回这个单元类型(),例如常见的println!()的返回值也是单元类型()。不占用任何内存。

语句和表达式

  • Rust的函数体是由一系列的语句组成,最后由一个表达式来返回值,如下
fn add_with_extra(x: i32, y: i32) -> i32 {let x = x + 1; // 语句let y = y + 5; // 语句x + y // 表达式
}

语句

  • 语句完成一个具体的操作,但是不返回值,如下:
let a = 8;
let b: Vec<f64> = Vec::new();
let (a, c) = ("hi", false);

表达式

  • 表达式会进行求值,然后返回一个值,表达式可以称为语句的一部分,例如 let y = 6,6就是一个表达式。如果表达式不返回任何值,会隐式的返回一个(),函数没有返回值,那么返回一个(),通过;结尾的语句返回一个()。如下用花括号包裹起来最终返回一个值的语句块也是表达式:
fn main() {let y = {let x = 3;x + 1};println!("The value of y is: {}", y);
}

以下函数会隐式返回一个()

use std::fmt::Debug;fn report<T: Debug>(item: T) {println!("{:?}", item);}

以下函数会显式的返回一个()

fn clear(text: &mut String) -> () {*text = String::from("");
}

注意:表达式不能以分号结尾,否则就会从表达式变成一条语句,再也不会返回一个值。

函数

  • Rust函数跟其它语言几乎没什么区别,如下
fn add(i: i32, j: i32) -> i32 {i + j}

声明函数的关键字fn,函数名add(),参数ij,参数类型和返回值类型都是i32

函数要点

  • 函数名和变量名使用蛇形命名法,例如fn add_two() -> {}
  • 函数位置可以随便放,Rust不关心我们在哪里定义了函数,只要有定义即可。
  • Rust是强类型语言,因此需要为每一个函数参数标识它的具体类型。

函数返回

  • 在Rust中函数就是表达式,我们可以把函数的返回值直接赋给调用者。函数的返回值就是函数体最后一条表达式的值,也可以使用return提前返回
//这个函数返回表达式x+5的值
fn plus_five(x:i32) -> i32 {x + 5
}
//该函数若x>5,就提前返回x-5的值,跟其它语言差别不大
fn plus_or_minus(x:i32) -> i32 {if x > 5 {return x - 5}x + 5
}fn main() {let x = plus_five(5);println!("The value of x is: {}", x);
}
  • 永远不返回的发散函数
    !用作函数返回类型的时候,表示该函数永远不返回,该语法往往用作会导致程序崩溃的函数:
fn dead_end() -> ! {panic!("你已经到了穷途末路,崩溃吧!");
}

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

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

相关文章

为响应国家号召,搜维尔科技开启虚拟仿真实验室设备升级改造服务

近日&#xff0c;国务院发布了关于《推动大规模设备更新和消费品以旧换新行动方案》&#xff0c;该通知的发布表现出国家对于科技创新事业的高度重视。各行各业都在积极响应国家号召&#xff0c;加快数字化转型和设备升级与更新步伐。搜维尔科技为响应国家号召&#xff0c;将开…

Redission 分布式锁原理分析

一、前言 我们先来说说分布式锁&#xff0c;为啥要有分布式锁呢? 像 JDK 提供的 synchronized、Lock 等实现锁不香吗&#xff1f;这是因为在单进程情况下&#xff0c;多个线程访问同一资源&#xff0c;可以使用 synchronized 和 Lock 实现&#xff1b;在多进程情况下&#xff…

单链表交叉分离,运用头插法,尾插法(算法库应用)

原文博客链接:单链表分离(头插法和尾插法的结合,理解指针变换)_3.对任务1或者2中创建的某一个单链表{a1,b1,a2,b2,...,an,bn},编写一个算法将-CSDN博客 函数实现: /************************************************** 函数名:separate_LinkList 功 能: 把一个链表,交叉新建…

电机控制杂谈——永磁同步电机中的永磁体谐波反电势

1.问题的引出 在我的谐波抑制专题中&#xff0c;讲了三种谐波抑制的策略。当时是通过增大逆变器死区来产生较大的谐波。但是在实际电机里面&#xff0c;我感觉死区的影响基本上没有。。。课题组的驱动器中&#xff0c;逆变器的非线性其实基本可以忽略不计了。 但是&#xff0…

langchin-chatchat部分开发笔记(持续更新)

大模型相关目录 大模型&#xff0c;包括部署微调prompt/Agent应用开发、知识库增强、数据库增强、知识图谱增强、自然语言处理、多模态等大模型应用开发内容 从0起步&#xff0c;扬帆起航。 大模型应用向开发路径及一点个人思考大模型应用开发实用开源项目汇总大模型问答项目…

SpringBoot中处理校验逻辑的两种方式:Hibernate Validator+全局异常处理

最近正在开发一个校园管理系统&#xff0c;需要对请求参数进行校验&#xff0c;比如说非空啊、长度限制啊等等&#xff0c;可选的解决方案有两种&#xff1a; 一种是用 Hibernate Validator 来处理一种是用全局异常来处理 两种方式&#xff0c;我们一一来实践体验一下。 一、…

AXI4-Stream Interconnect IP核(1)——原理

一、概述 AXI4-Stream Interconnect 是复杂片上系统&#xff08;SoC&#xff09;和现场可编程门阵列&#xff08;FPGA&#xff09;应用设计中的关键组件&#xff0c;它负责在系统内部不同模块之间路由数据流。AXI4-Stream协议是ARM引入的AMBA&#xff08;高级微控制器总线架构&…

插入排序和希尔排序:

插入排序 1. 算法思想&#xff1a; 由数组下标为1 开始的数值作为判断依据&#xff0c;与之前的数据从后往前比较定义tmp 暂存判断的数值&#xff0c;若前面的数据大于tmp&#xff0c;则将前面的数据向后移动 : arr[j1]arr[j]若对比的数据比tmp 大&#xff0c;则往后移&#…

JavaIO流与字节输出流OutputStream

1 概述 1.1 什么是IO流 IO流是存储和读取数据的解决方案&#xff0c;用于读写文件中的数据&#xff08;包括本地文件、网络等&#xff09; IO流的参照是程序或内存&#xff0c;即使程序在读&#xff0c;程序在写。 1.2 IO的分类 根据流的方向分为&#xff1a;输入流和输出流…

C++STL学习之unordered_map与unordered_set(底层Hash)

前言&#xff1a;我们前面已经学习论map和set&#xff0c;现在又冒出来一个unordered_map和unordered_set&#xff0c;这两个有啥差别吗&#xff1f;前面我们已经说过&#xff0c;map和set的底层是红黑树&#xff0c;那unordered_map和unordered_set的底层是什么呢&#xff1f;…

esp32CAM环境搭建(arduino+MicroPython+thonny+固件)

arduino ide 开发工具 arduino版本&#xff1a;1.8.19 arduino ide 中文设置&#xff1a;​ file >> preferences >> ​ arduino IDE 获取 ESP32 开发环境&#xff1a;打开 Arduino IDE &#xff0c;找到 文件>首选项 ,将 ESP32 的配置链接填入附加开发板管理网…

【Canvas与艺术】简约式胡萝卜配色汽车速度表

【效果图】 【代码】 <!DOCTYPE html> <html lang"utf-8"> <meta http-equiv"Content-Type" content"text/html; charsetutf-8"/> <head><title>胡萝卜色汽车速度仪表盘简化版</title><style type"…

2月京东天猫淘宝茗茶电商数据分析(茗茶行业未来趋势分析)

随着消费者对健康饮食和品质生活的追求&#xff0c;茗茶行业受到许多青睐和关注。 根据鲸参谋数据显示&#xff0c;今年2月&#xff0c;茗茶行业在某东平台上销售数据呈现出一种特殊的趋势。销售量总计约450万件&#xff0c;同比去年下滑了7%。&#xff1b;销售额总计6.4亿元&…

Linux安装Maven

一、下载安装Maven 1.1 下载地址 官网下载地址: https://maven.apache.org/download.cgi 1.2 安装版本下载 进入下载页面选择需要的版本进行下载。 1.3 版本安装 将下载完的安装包&#xff0c;上传到Linux服务器上某个目录下&#xff0c;将其解压出来就好。 ## 创建安装…

《无名之辈》新手攻略:抢先领取神秘礼包!

欢迎来到《无名之辈》&#xff01;在这个丰富多彩的冒险世界里&#xff0c;你将踏上一段充满挑战与机遇的旅程。以下是针对新手玩家的详尽攻略&#xff0c;助你快速提升实力&#xff0c;成为一名优秀的冒险者。 第一步&#xff1a;迅速起步 当你第一次踏入《无名之辈》的世界时…

文献速递:基于SAM的医学图像分割--SAMUS:适应临床友好型和泛化的超声图像分割的Segment Anything模型

Title 题目 SAMUS: Adapting Segment Anything Model for Clinically-Friendly and Generalizable Ultrasound Image Segmentation SAMUS&#xff1a;适应临床友好型和泛化的超声图像分割的Segment Anything模型 01 文献速递介绍 医学图像分割是一项关键技术&#xff0c;用…

ubuntu卸载Anaconda

1. 删除配置的环境变量 sudo gedit ~/.bashrc # >>> conda initialize >>> # !! Contents within this block are managed by conda init !! __conda_setup"$(/work3/ai_tool/anaconda3/bin/conda shell.bash hook 2> /dev/null)" if [ $? -…

edge浏览器彻底删除用户账号

效果图 操作教程 -- 这个教程里面比较重要的是3,5,8 -- 如果不执行第8步&#xff0c;还是没有任何效果。 -- 教程地址 https://blog.csdn.net/qq_37579133/article/details/128777770 继续删除windows凭据 结束 -----华丽的分割线&#xff0c;以下是凑字数&#xff0c;大家不…

《无名之辈》天涯镖局攻略:高效拉镖窍门!

《无名之辈》天涯镖局开启要注意什么&#xff0c;在这里&#xff0c;每一次运镖都是一次刺激的冒险&#xff0c;而掌握合适的策略将让你事半功倍。以下是天涯镖局的开启攻略&#xff0c;助你在危机四伏的路途上赢得胜利。 ① 拉取适当级别的包子和加速卡 在天涯镖局中&#xf…

阿里云部署宝塔,设置了安全组还是打不开。

1.在安全组是开放正确的端口好。8888要开&#xff0c;但是不只是开放8888&#xff0c;举个例子&#xff0c;https://47.99.53.222:17677/49706cf7这个&#xff0c;要开放17677这个端口号。 2.安全组要挂载到实例上&#xff0c;从三个点的进入点击管理实例&#xff0c;加到对应的…