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

isizeusize 类型表示当前计算机系统的位宽, 32位系统下 isize 的长度为 32, 64位系统下 isize 的长度为64, usize 同上

Rust 为什么要如此命名这些整数类型:

  • 位(bit): 位是电子计算机中最小的数据单位, 每一位的状态只能是0或1

  • 字节(byte): 8个二进制位组成一个字节

我们日常所喊的字节并不是最小的计算机单位, 最小的计算机单位是 bit, 所以用数字表示整数的长度很合适, 数字前面的字母表示的是单词简写, i表示integer, u表示unsigned

  • 浮点型分为f32f64, 默认浮点类型为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
}
如果对我分享的内容感兴趣的话  记得关注我得动态
求推荐  求收藏  求转发  求关注
posted @ 2021-02-06 17:04  Delayer  阅读(310)  评论(0)    收藏  举报