TranslateProject/published/20230501.1 ⭐️⭐️ Rust Basics Series 6 Conditional Statements.md
2023-06-11 09:50:18 +08:00

208 lines
6.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

[#]: subject: "Rust Basics Series #6: Conditional Statements"
[#]: via: "https://itsfoss.com/rust-if-else/"
[#]: author: "Pratham Patel https://itsfoss.com/author/pratham/"
[#]: collector: "lkxed"
[#]: translator: "Cubik65536"
[#]: reviewer: "wxy"
[#]: publisher: "wxy"
[#]: url: "https://linux.cn/article-15896-1.html"
Rust 基础系列 #6: 条件语句
======
![][0]
在 [上一篇文章][1] 中,你学习了函数。在这篇文章中,我们将学习使用条件语句来管理 Rust 程序的控制流。
### 什么是条件语句?
在编写代码的时候,最常见的任务之一就是检查某些条件是否为 `true``false`。“如果温度高于 35°C打开空调。”
通过使用 `if``else` 这样的关键字(有时候结合使用),程序员可以根据条件(例如提供的参数数量、从命令行传递的选项、文件名、错误发生等)改变程序的行为。
所以,对一个程序员来说,了解任何语言的控制流都是至关重要的,更不用说 Rust 了。
#### 条件运算符
下表列出了所有常用的单个条件运算符:
| 运算符 | 示例 | 解释 |
| :- | :- | :- |
| `>` | `a > b` | `a` **大于** `b` |
| `<` | `a < b` | `a` **小于** `b` |
| `==` | `a == b` | `a` **等于** `b` |
| `!=` | `a != b` | `a` **不等于** `b` |
| `>=` | `a >= b` | `a` **大于****等于** `b` |
| `<=` | `a <= b` | `a` **小于****等于** `b` |
以及下表是逻辑运算符,它们用于一个或多个条件之间:
| 运算符 | 示例 | 解释 |
| :- | :- | :- |
| `||` (逻辑或) | `条件1 || 条件2` | `条件1``条件2` 中至少有一个为 `true` |
| `&&` (逻辑与) | `条件1 && 条件2` | **所有** 条件都为 `true` |
| `!` (逻辑非) | `!条件` | `条件` 的布尔值的相反值 |
> 📋 与数学相似,你可以使用圆括号来指定操作的优先级。
### 使用 if else
要控制 Rust 代码的基本流程,使用两个关键字:`if` 和 `else`。这可以根据提供的条件的状态创建两个“执行路径”。
一个简单的带有替代执行路径的 if 块的语法如下:
```
if 条件 {
<语句>;
} else {
<语句>;
}
```
> 📋 当只有一个条件时,将其括在圆括号中并不是强制性的。根据语法,使用圆括号是可选的。你仍然应该使用它们来指定优先级并优化可读性。
来看看一个例子。
```
fn main() {
let a = 36;
let b = 25;
if a > b {
println!("a 大于 b");
} else {
println!("b 大于 a");
}
}
```
这里,我声明了两个整数变量 `a``b`,它们的值分别为 '36' 和 '25'。在第 5 行,我检查变量 `a` 中存储的值是否大于变量 `b` 中存储的值。如果条件计算结果为 `true`,则会执行第 6 行的代码。如果条件计算结果为 `false`,由于我们有一个 `else` 块(可选),第 8 行的代码将被执行。
来看看程序的输出。
```
a 大于 b
```
完美!
来修改一下变量 `a` 的值,使其小于变量 `b` 的值,看看会发生什么。我将把 `a` 的值改为 '10'。修改后的输出如下:
```
b 大于 a
```
但是,如果我将相同的值存储在变量 `a``b` 中呢?为了看到这一点,我将两个变量的值都设置为 '40'。修改后的输出如下:
```
b 大于 a
```
嗯?从逻辑上讲,这没有任何意义... :(
但是这可以改进!我们继续。
### 使用 else if 条件
与其他任何编程语言一样,你可以使用 `else if` 块来提供多于两个的执行路径。语法如下:
```
if 条件 {
<语句>;
} else if 条件 {
<语句>;
} else {
<语句>;
}
```
现在,通过使用 `else if` 块,我可以改进程序的逻辑。下面是修改后的程序。
```
fn main() {
let a = 40;
let b = 40;
if a == b {
println!("a 与 b 是相等的");
} else if a > b {
println!("a 大于 b");
} else {
println!("b 大于 a");
}
}
```
现在,我的程序的逻辑是正确的。它已经处理了所有的边缘情况(我能想到的)。第 5 行处理了 `a` 等于 `b` 的情况。第 7 行处理了 `a` 可能大于 `b` 的情况。而 `a` 小于 `b` 的情况则由第 9 行的 `else` 块隐式处理。
现在,当我运行这段代码时,我得到了以下输出:
```
a 与 b 是相等的
```
现在这就完美了!
### 示例:找到最大值
我知道使用 `if``else` 很容易,但是让我们再看一个程序。这次,我们来比较三个数字。我还将在这个实例中使用逻辑运算符!
```
fn main() {
let a = 73;
let b = 56;
let c = 15;
if (a != b) && (a != c) && (b != c) {
if (a > b) && (a > c) {
println!("a 是最大的");
} else if (b > a) && (b > c) {
println!("b 是最大的");
} else {
println!("c 是最大的");
}
}
}
```
这个程序第一眼看上去可能很复杂,但是不要害怕,我会解释的!
最开始,我声明了三个变量 `a`、`b` 和 `c`,并赋予了我能想到的随机值。然后,在第 6 行,我检查了没有变量的值与其他变量相同的条件。首先,我检查 `a``b` 的值,然后是 `a``c`,最后是 `b``c`。这样我就可以确定没有变量中存储了重复的值。
然后,在第 7 行,我检查了变量 `a` 中存储的值是否是最大的。如果这个条件计算结果为 `true`,则会执行第 8 行的代码。否则,将检查第 9 行的执行路径。
在第 9 行,我检查了变量 `b` 中存储的值是否是最大的。如果这个条件计算结果为 `true`,则会执行第 10 行的代码。如果这个条件也是 `false`那么只有一种可能。3 个变量中的最大值既不是 `a` 也不是 `b`
所以,自然地,在 `else` 块中,我打印出变量 `c` 拥有最大值。
来看看程序的输出:
```
a 是最大的
```
这是预期的结果。尝试修改分配给每个变量的值,并自己测试一下! :)
### 总结
你学习到了如何使用 `if``else` 语句。在你继续使用大量 `if` `else if` 语句制作自己的 AI 之前(哈哈),让我们在本系列的下一篇文章中学习 Rust 中的循环。
持续关注。
*题图MJ/3eea3bbb-b630-4470-ae21-391ab86cd5bf*
--------------------------------------------------------------------------------
via: https://itsfoss.com/rust-if-else/
作者:[Pratham Patel][a]
选题:[lkxed][b]
译者:[Cubik65536](https://github.com/Cubik65536)
校对:[wxy](https://github.com/wxy)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
[a]: https://itsfoss.com/author/pratham/
[b]: https://github.com/lkxed/
[1]: https://linux.cn/article-15855-1.html
[0]: https://img.linux.net.cn/data/attachment/album/202306/11/094832bkkbs7oxntx7zxas.jpg