打赏

[易学易懂系列|rustlang语言|零基础|快速入门|(8)|Operators操作符]

[易学易懂系列|rustlang语言|零基础|快速入门|(8)]

有意思的基础知识

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

参考文章:https://doc.rust-lang.org/reference/expressions/operator-expr.html#the-dereference-operator

posted @ 2019-11-25 09:14  gyc567  阅读(342)  评论(0编辑  收藏  举报