[易学易懂系列|rustlang语言|零基础|快速入门|(8)|Operators操作符]
有意思的基础知识
Operators
我们今天再来看看操作符。
算术运算 操作符: + - * / %
代码如下 :
let a = 5;
let b = a + 1; //6
let c = a - 1; //4
let d = a * 2; //10
let e = a / 2; // ⭐️ 2 not 2.5
let f = a % 2; //1
let g = 5.0 / 2.0; //2.5
+操作符,还可以用来数组和字符串的 串接 。
比较操作符: == != < > <= >=
let a = 1;
let b = 2;
let c = a == b; //false
let d = a != b; //true
let e = a < b; //true
let f = a > b; //false
let g = a <= a; //true
let h = a >= a; //true
// 🔎
let i = true > false; //true
let j = 'a' > 'A'; //true
逻辑操作符: ! && ||
let a = true;
let b = false;
let c = !a; //false
let d = a && b; //false
let e = a || b; //true
对于整数(integer)类型,操作符!会把它们的值转化为二进制的值 :
let a = !-2; //1
let b = !-1; //0
let c = !0; //-1
let d = !1; //-2
位操作符: & | ^ << >>
let a = 1;
let b = 2;
let c = a & b; //0 (01 && 10 -> 00)
let d = a | b; //3 (01 || 10 -> 11)
let e = a ^ b; //3 (01 != 10 -> 11)
let f = a << b; //4 (Add b number of 0s to the end of a -> '01'+'00' -> 100)
let g = a >> b; //0 (Remove b number of bits from the end of a -> o̶1̶ -> 0)
组合赋值运算符 :
let mut a = 2;
a += 5; //2 + 5 = 7
a -= 2; //7 - 2 = 5
a *= 5; //5 * 5 = 25
a /= 2; //25 / 2 = 12 not 12.5
a %= 5; //12 % 5 = 2
a &= 2; //10 && 10 -> 10 -> 2
a |= 5; //010 || 101 -> 111 -> 7
a ^= 2; //111 != 010 -> 101 -> 5
a <<= 1; //'101'+'0' -> 1010 -> 10
a >>= 2; //101̶0̶ -> 10 -> 2
类型转换操作符: as
let a = 15;
let b = (a as f64) / 2.0; //7.5
借用操作符: & &mut
&:
fn main() {
let a = [1, 2, 3];
let b = &a;
println!("{:?} {}", a, b[0]); // [1, 2, 3] 1
}
&mut:
fn main() { let mut a = [1, 2, 3]; let b = &mut a; b[0] = 4; println!("{:?}", b); // [4, 2, 3] }
解除引用 操作符: *
请看例子:
#![allow(unused_variables)] fn main() { let x = &7; assert_eq!(*x, 7);//true let y = &mut 9; *y = 11; assert_eq!(*y, 11);//true assert_eq!(*y, 9);//false }
从上面代码,看到这个奇怪的定义:&7。
这是什么意思呢?
从之前的概念知道,这是借用,从7这里借用数据所有权。
那这个7数据一般放在哪里呢?
内存里一个地址。
对了。这个&7,其实,就是把它的内存地址绑定到x。
那*x,什么意思呢?
就是解除引用,即把x所绑定的内存地址指向的数据,把它“解除”出来。
这里就是数据:7 。
所以,assert_eq!(*x, 7)为true。
即*x==7。
还有如下代码 :
fn main() { let x = 5; let y = &x; assert_eq!(5, x);//true assert_eq!(5, y);//false assert_eq!(5, *y);//true }
所以,到这里,我们可以得出又一个重要结论:
1.所有借用,都是把内存地址绑定到另一个变量。
2.共享借用,内存地址绑定到一个变量a后,可以用*a来得到内存地址所存入的值。此时,a没有原始数据所有权,不能修改数据。
3.可变借用,内存地址绑定到一个变量a后,可以用*a来得到内存地址所存入的值。此时,a有原始数据所有权,可以修改数据。
以上,希望对你有用。
如果遇到什么问题,欢迎加入:rust新手群,在这里我可以提供一些简单的帮助,加微信:360369487,注明:博客园+rust
本人精通java高并发,DDD,微服务等技术实践,以及python,golang技术栈。 本人姓名郭莹城,坐标深圳,前IBM架构师、咨询师、敏捷开发技术教练,前IBM区块链研究小组成员、十四年架构设计工作经验,《区块链核心技术与应用》作者之一, 现有成熟团队提供区块链开发相关业务(公链,交易所,钱包,Dapp,智能合约)。 工作微信&QQ:360369487,交易所开发与区块链钱包开发业务,加我注明:博客园+开发,想学习golang和rust的同学,也可以加我微信,备注:博客园+golang或博客园+rust,谢谢!
参考文章:https://learning-rust.github.io/docs/a9.operators.html
参考文章: