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中使用前缀来表示进制类型,如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 关系运算符
关系运算符用于比较两个之间的关系,返回值是一个布尔类型。下面的表格中列举了所有的关系运算符。
名称 | 运算符 | 说明 |
---|---|---|
大于 | > | 左操作数大于右操作数则返回 true ,否则返回 false |
小于 | < | 左操作数小于于右操作数则返回 true,否则返回 false |
等于 | == | 左操作数等于右操作数则返回 true,否则返回 false |
大于等于 | >= | 左操作数大于或等于右操作数则返回,true 否则返回 false |
小于等于 | <= | 左操作数小于或等于右操作数则返回,true 否则返回 false |
不等于 | != | 左操作数不等于右操作数则返回 true,否则返回 false |
示例代码如下:
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 逻辑运算符
逻辑运算符用于组合两个或多个条件表达式,其返回的结果是布尔类型。逻辑运算符就是在数学书常说的“与”,“或”,“非”。严格意义上应该叫做逻辑与,逻辑或,逻辑非。详细说明见下表。
名称 | 运算符 | 说明 |
---|---|---|
逻辑与 | && | 两边的条件表达式都为真则返回 true,否则返回 false |
逻辑或 | || | 两边的条件表达式只要有一个为真则返回 true,否则返回 false |
逻辑非 | ! | 如果表达式为真则返回 false,否则返回 true |
示例代码如下:
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 支持的所有位运算操作。
名字 | 运算符 | 说明 |
---|---|---|
位与 | & | 相同位都是 1 则返回 1,否则返回 0 |
位或 | | | 相同位只要有一个是 1 则返回 1,否则返回 0 |
异或 | ^ | 相同位不相同则返回 1,否则返回 0 |
位非 | ! | 把位中的 1 换成 0 , 0 换成 1 |
左移 | << | 操作数中的所有位向左移动指定位数,右边的位补 0 |
右移 | >> | 操作数中的所有位向右移动指定位数,左边的位补 0 |
下面用数字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,小明和小红总共有多少钱呢?
0x07 本节源码
007 · StudyRust - 码云 - 开源中国 (gitee.com)
下节预告——了解Rust的类型转换
网友评论