【RUST学习日记】第7课 字面量和运算符

简介: 【RUST学习日记】第7课 字面量和运算符

0x00 回顾


上一节讲解了变量和常量,主要了解了他们的区别。也初步感觉到在Rust中对安全性。这节咱们讲解字面量和常用的一些运算符。


0x01 字面量(Literal)


字面量是用于表达源代码中一个固定值的表示法。几乎所有计算机编程语言都具有对基本值的字面量表示,诸如:整数、浮点数以及字符串。对于字面量只能作为等号右边的值出现。

示例代码如下:

// 字面量
    // (1)通过后缀表示类型
    let a = 7u8;
    let b = 5.4f64;
    let c = 32i32;
    let d = "zhangsan";
    // (2)通过前缀表示进制
    // 二进制
    let e = 0b1;
    // 八进制
    let f = 0o7;
    // 十六进制
    let g = 0xa;
    // byte
    let h = b'A';
    // (3)通过 “_” 来分割数据,易于可读性
    let j = 10_000;
    let k = 200_000.000_1;


通过上面的示例可以看到,在Rust中使用前缀来表示进制类型,如0b0o0xb分别表示二进制,八进制,十六进制,字节类型。使用后缀也可以声明字面量的类型,如果let a = 7u8。通过_来分割数值字面量,易于可读性。10_000等于10000


0x02 算术运算符


一说到运算符,笔者瞬间想到了童年,坐在小学教室里,老师在黑板上讲解混合四则运算......扯远了。在所有的编程语言中都存在运算符,Rust也不例外。


image.png


let aa = 12;
    let bb = 9;
    dbg!(aa + bb);
    dbg!(aa - bb);
    dbg!(aa * bb);
    dbg!(aa / bb);
    dbg!(aa % bb);
    // 不支持自定和自减运算符
    // aa++ bb++

代码执行结果:

[src\main.rs:34] aa + bb = 21
[src\main.rs:35] aa - bb = 3
[src\main.rs:36] aa * bb = 108
[src\main.rs:37] aa / bb = 1
[src\main.rs:38] aa % bb = 3

另外,Rust并不像C,C++,Java等语言那样支持自增自减运算。但是支持下列的方式运算。


image.png


let mut cc = 20;
    let dd = 5;
    println!("初始值 cc = {} dd = {}", cc, dd);
    // cc = cc + dd;
    cc += dd;
    println!("经过 cc += dd 运算后,cc的值为:{:}", cc);
    // cc = cc - dd;
    cc -= dd;
    println!("经过 cc -= dd 运算后,cc的值为:{:}", cc);
    // cc = cc * dd;
    cc *= dd;
    println!("经过 cc *= dd 运算后,cc的值为:{:}", cc);
    // cc = cc / dd;
    cc /= dd;
    println!("经过 cc /= dd 运算后,cc的值为:{:}", cc);
    // cc = cc % dd;
    cc %= dd;
    println!("经过 cc %= dd 运算后,cc的值为:{:}", cc);
    // 自增
    cc += 1;
    println!("经过 cc += 1 运算后,cc的值为:{:}", cc);
    // 自减
    cc -= 1;
    println!("经过 cc -= 1 运算后,cc的值为:{:}", cc);

代码执行结果:

初始值 cc = 20 dd = 5
经过 cc += dd 运算后,cc的值为:25
经过 cc -= dd 运算后,cc的值为:20
经过 cc *= dd 运算后,cc的值为:100
经过 cc /= dd 运算后,cc的值为:20
经过 cc %= dd 运算后,cc的值为:0
经过 cc += 1 运算后,cc的值为:1
经过 cc -= 1 运算后,cc的值为:0

看过上面的代码,其实就相当于运算的简写了。例如:a+=b 等同于 a = a + b。其中自增,自减也可以通过上述方法实现了。


0x03 关系运算符


关系运算符用于比较两个之间的关系,返回值是一个布尔类型。下面的表格中列举了所有的关系运算符。


image.png


示例代码如下:

let mm = 15;
    let nn = 30;
    dbg!(mm > nn);
    dbg!(mm < nn);
    dbg!(mm == nn);
    dbg!(mm >= nn);
    dbg!(mm <= nn);
    dbg!(mm != nn);

代码执行结果:

[src\main.rs:74] mm > nn = false
[src\main.rs:75] mm < nn = true
[src\main.rs:76] mm == nn = false
[src\main.rs:77] mm >= nn = false
[src\main.rs:78] mm <= nn = true
[src\main.rs:79] mm != nn = true


0x04 逻辑运算符


逻辑运算符用于组合两个或多个条件表达式,其返回的结果是布尔类型。逻辑运算符就是在数学书常说的“与”,“或”,“非”。严格意义上应该叫做逻辑与逻辑或逻辑非。详细说明见下表。


image.png


示例代码如下:

let rr = 56;
    let ss = 34;
    dbg!(rr > 40 && ss > 40);
    dbg!(rr > 40 || ss > 40);
    dbg!(!(rr > 40));

代码执行结果:

[src\main.rs:90] rr > 40 && ss > 40 = false
[src\main.rs:91] rr > 40 || ss > 40 = true
[src\main.rs:92] !(rr > 40) = false


0x05 位运算符


位运算符是针对二进制数据进行操作。下表列出了 Rust 支持的所有位运算操作。


image.png


下面用数字27为例,看下代码的运行结果,示例代码如下:


// 2 的 二进制表示
    let x: i8 = 0b00000010;
    // 7 的 二进制表示
    let y: i8 = 0b00000111;
    println!("{:08b} & {:08b} = {:08b}", x, y, x & y);
    println!("{:08b} | {:08b} = {:08b}", x, y, x | y);
    println!("{:08b} ^ {:08b} = {:08b}", x, y, x ^ y);
    println!("!{:08b} = {:08b}", x, !x);
    println!("{:08b} << 1 = {:08b}", x, x << 1);
    println!("{:08b} >> 1 = {:08b}", x, x >> 1);

PS:代码中{:08b}是将数据转为二进制格式输出,总共输出8位,未知空白部分使用0填充。有关格式化输出的内容,将会在后续章节介绍,这里了解即可。

代码执行结果:

00000010 & 00000111 = 00000010
00000010 | 00000111 = 00000111
00000010 ^ 00000111 = 00000101
!00000010 = 11111101
00000010 << 1 = 00000100
00000010 >> 1 = 00000001


0x06 小结


算术运算符已经学完了,有没有想过动手做个题练习下?请使用Rust语言解答下面的思考题:

小明有5块钱,小红有3块5,小明和小红总共有多少钱呢?

相关文章
|
4天前
|
Rust 算法 安全
学习Rust
【10月更文挑战第13天】学习Rust
28 8
|
5天前
|
Rust 安全 算法
Rust的学习
【10月更文挑战第12天】Rust的学习
13 2
|
5天前
|
Rust 算法 安全
如何学习Rust编程?
【10月更文挑战第12天】如何学习Rust编程?
17 1
|
17天前
|
Rust API
【Rust学习】09_方法语法
结构体让你可以创建出在你的领域中有意义的自定义类型。通过结构体,我们可以将相关联的数据片段联系起来并命名它们,这样可以使得代码更加清晰。在 impl 块中,你可以定义与你的类型相关联的函数,而方法是一种相关联的函数,允许您指定结构体的实例具有的行为。 但是结构体并不是创建自定义类型的唯一方式:让我们转向 Rust 的 enum 功能,将另一个工具添加到你的工具箱中。
10 0
|
1月前
|
Rust 索引
【Rust学习】08_使用结构体代码示例
为了了解我们何时可能想要使用结构体,让我们编写一个计算长方形面积的程序。我们将从使用单个变量开始,然后重构程序,直到我们改用结构体。
72 2
|
1月前
|
存储 Rust 编译器
【Rust学习】07_结构体说明
**struct**或 ***structure***是一种自定义数据类型,允许您命名和包装多个相关的值,从而形成一个有意义的组合。如果您熟悉面向对象的语言,那么**struct**就像对象中的数据属性。在本章中,我们将比较和对比元组与结构体,在您已经知道的基础上,来演示结构体是对数据进行分组的更好方法。
21 1
|
1月前
|
Rust Linux Go
Rust/Go语言学习
Rust/Go语言学习
|
2月前
|
存储 Rust 安全
【Rust学习】06_切片
所有权、借用和切片的概念确保了 Rust 程序在编译时的内存安全。Rust 语言提供了跟其他系统编程语言相同的方式来控制你使用的内存,但拥有数据所有者在离开作用域后自动清除其数据的功能意味着你无须额外编写和调试相关的控制代码。
21 1
|
3月前
|
存储 Rust 安全
【Rust学习】04_所有权
所有权是 Rust 最独特的特性,对语言的其余部分有着深远的影响。它使 Rust 能够在不需要垃圾收集器的情况下保证内存安全,因此了解所有权的运作方式非常重要。在本章中,我们将讨论所有权以及几个相关功能:借用、切片以及 Rust 如何在内存中布局数据。
21 1
|
3月前
|
存储 Rust 编译器
【Rust学习】03_通用编程概念
您成功了!这是一个相当大的章节:您了解了变量、标量和复合数据类型、函数、注释、 if 表达式和循环!若要练习本章中讨论的概念。
40 2