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中使用前缀来表示进制类型,如0b
,0o
,0x
,b
分别表示二进制,八进制,十六进制,字节类型。使用后缀也可以声明字面量的类型,如果let a = 7u8
。通过_
来分割数值字面量,易于可读性。10_000
等于10000
。
0x02 算术运算符
一说到运算符,笔者瞬间想到了童年,坐在小学教室里,老师在黑板上讲解混合四则运算......扯远了。在所有的编程语言中都存在运算符,Rust也不例外。
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等语言那样支持自增自减运算。但是支持下列的方式运算。
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 关系运算符
关系运算符用于比较两个之间的关系,返回值是一个布尔类型。下面的表格中列举了所有的关系运算符。
示例代码如下:
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 逻辑运算符
逻辑运算符用于组合两个或多个条件表达式,其返回的结果是布尔类型。逻辑运算符就是在数学书常说的“与”,“或”,“非”。严格意义上应该叫做逻辑与,逻辑或,逻辑非。详细说明见下表。
示例代码如下:
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 支持的所有位运算操作。
下面用数字2
和7
为例,看下代码的运行结果,示例代码如下:
// 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,小明和小红总共有多少钱呢?