Rust 入门 数据类型 运算符
数据类型
- 在 Rust 中, 每一个值都属于某一个 数据类型(data type)
- Rust 中存在两类数据类型子集: 标量(scalar) 和 复合(compound) 类型
- Rust 是静态类型(statically typed) 语言, 在编译期间就需要确定变量的具体数据类型
标量类型
-
标量(scalar) 类型代表一个单独的值
-
Rust 中有四种基本的标量类型
- 整数型: 没有小数部分的数字
- 浮点型: 带有小数部分的数字
- 布尔型: 代表逻辑值
- 字符型: 可存贮一个任意字符
-
每一个整数型都可以是无符号或者有符号类型, 默认整数类型为
i32
| 长度(bit) | 有符号表示 | 无符号表示 |
|---|---|---|
| 8 | i8 | u8 |
| 16 | i16 | u16 |
| 32 | i32 | u32 |
| 64 | i64 | u64 |
| 128 | i128 | u128 |
| arch | isize | usize |
isize和usize类型表示当前计算机系统的位宽, 32位系统下 isize 的长度为 32, 64位系统下 isize 的长度为64, usize 同上
Rust 为什么要如此命名这些整数类型:
位(bit): 位是电子计算机中最小的数据单位, 每一位的状态只能是0或1
字节(byte): 8个二进制位组成一个字节
我们日常所喊的字节并不是最小的计算机单位, 最小的计算机单位是 bit, 所以用数字表示整数的长度很合适, 数字前面的字母表示的是单词简写,
i表示integer,u表示unsigned
- 浮点型分为
f32和f64, 默认浮点类型为f64 - 布尔型不需要过多解释, 他们很简单, 只有两个值(
true&false), 表示逻辑运算 - 字符类型(
char)的大小为4byte, 他代表了一个 Unicode 标量值(Unicode Scalar Value), 这意味着它可以比 ASCII 表示更多内容, 但 Rust 中的字符类型并不是 Unicode 中的标准概念
复合类型
- 复合类型(Compound types) 可以将多个值组合成一个类型
- Rust 有两个原生的复合类型: 元组(tuple) 和数组(array)
元组类型
- 元组是一个将多个其他类型的值组合进一个复合类型的主要方式
- 元组长度固定: 一旦声明, 其长度不会增大或缩小
- 我们使用包含在圆括号中的逗号分隔的值列表来创建一个元组
fn main() {
let tup: (i32, f64, u8) = (500, 6.4, 1);
}
- 使用变量分解元组的过程叫做解构(destructuring)
fn main() {
let tup = (500, 6.4, 1);
let (x, y, z) = tup;
println!("{}\n{}\n{}", x, y, z);
}
- 除了对元组进行解构, 还可以用下标索引访问
fn main() { // 元组只能用 . 符号访问下标, 注意: 它区别与数组
let tup = (500, 6.4, 1);
let x = tup.0;
let y = tup.1;
let z = tup.2;
println!("{}\n{}\n{}", x, y, z);
}
数组类型
-
数组是一个同类型元素的集合
-
数组长度固定: 一旦声明, 其长度不会增大或缩小
-
数组中的值位于中括号内的逗号分隔的列表中
fn main() {
let arr = [1, 2, 3, 4, 5];
}
- 我们可以在方括号中包含每个元素的类型, 后跟分号, 再后跟数组元素的数量
fn main() {
let arr: [i32; 5];
}
- 数组同样使用下标进行访问
fn main() {
let arr = [1, 2, 3, 4, 5];
println!("数组中的第一个元素为: {}", arr[0]);
}
- 无论是元组还是数组, 无效的下标访问会使程序发生恐慌(panic)
thread 'main' panicked at 'index out of bounds: the len is 5 but the index is 10'
运算符
- 基本运算符
fn main() {
// 加法
let sum = 5 + 10;
// 减法
let difference = 95.5 - 4.3;
// 乘法
let product = 4 * 30;
// 除法
let quotient = 56.7 / 32.2;
// 取余
let remainder = 43 % 5;
}
- 位运算符
fn main() {
let a: i32 = 2; // 0 0 0 0 0 0 1 0
let b: i32 = 3; // 0 0 0 0 0 0 1 1
// 位与
let v1 = a & b; // 结果为 2
// 位或
let v2 = a | b; // 结果为 3
// 位非
let v3 = !b; // 结果为 -4
// 位亦或
let v4 = a ^ b; // 结果为 1
// 左移
let v5 = a << b; // 结果为 16
// 右移
let v6 = a >> b; // 结果为 0
}
- 逻辑运算符
fn main() {
let a = 1;
let b = 2;
// 比较
let v1 = a == b; // false
let v2 = a != b; // true
// 与运算
let v3 = true && true; // true
// 或运算
let v4 = false || true; // true
// 取反
let v5 = !false; // true
}
如果对我分享的内容感兴趣的话 记得关注我得动态
求推荐 求收藏 求转发 求关注
求推荐 求收藏 求转发 求关注

浙公网安备 33010602011771号