控制流 (if, loop, while, for)
在编程中,控制流是指程序执行的顺序。通过控制流,我们可以根据条件执行不同的代码块,或者重复执行某段代码。Rust 提供了多种控制流结构,包括 if、loop、while 和 for。本教程将详细介绍这些控制流结构,并通过代码示例和实践练习帮助你掌握它们。
1. if 语句
if 语句用于根据条件执行不同的代码块。条件通常是一个布尔表达式,如果条件为 true,则执行 if 代码块中的代码;如果条件为 false,则跳过 if 代码块。
1.1 基本语法
fn main() {
let number = 5;
if number < 10 {
println!("number is less than 10");
} else {
println!("number is greater than or equal to 10");
}
}
1.2 else if 语句
你可以使用 else if 来处理多个条件:
fn main() {
let number = 20;
if number < 10 {
println!("number is less than 10");
} else if number < 20 {
println!("number is between 10 and 20");
} else {
println!("number is greater than or equal to 20");
}
}
1.3 条件表达式
Rust 中的 if 语句还可以用作表达式,返回一个值:
fn main() {
let condition = true;
let number = if condition { 5 } else { 6 };
println!("The value of number is: {}", number);
}
2. loop 循环
loop 循环用于无限循环执行某段代码,直到你手动中断它。
2.1 基本语法
fn main() {
let mut count = 0;
loop {
count += 1;
println!("count: {}", count);
if count == 5 {
break; // 中断循环
}
}
}
2.2 break 和 continue
break用于立即退出循环。continue用于跳过当前迭代,继续下一次迭代。
fn main() {
let mut count = 0;
loop {
count += 1;
if count % 2 == 0 {
continue; // 跳过偶数
}
println!("count: {}", count);
if count == 5 {
break; // 中断循环
}
}
}
3. while 循环
while 循环在条件为 true 时重复执行代码块。
3.1 基本语法
fn main() {
let mut number = 3;
while number != 0 {
println!("{}!", number);
number -= 1;
}
println!("LIFTOFF!!!");
}
3.2 break 和 continue
while 循环中也可以使用 break 和 continue:
fn main() {
let mut number = 10;
while number > 0 {
if number % 2 == 0 {
number -= 1;
continue; // 跳过偶数
}
println!("{}!", number);
number -= 1;
}
println!("LIFTOFF!!!");
}
4. for 循环
for 循环用于遍历集合(如数组、范围等)中的每个元素。
4.1 基本语法
fn main() {
let a = [10, 20, 30, 40, 50];
for element in a.iter() {
println!("the value is: {}", element);
}
}
4.2 范围循环
你可以使用 .. 运算符来创建一个范围,并遍历它:
fn main() {
for number in 1..4 {
println!("{}!", number);
}
println!("LIFTOFF!!!");
}
4.3 rev 方法
你可以使用 rev 方法来反转范围的顺序:
fn main() {
for number in (1..4).rev() {
println!("{}!", number);
}
println!("LIFTOFF!!!");
}
5. 实践练习
练习 1: 猜数字游戏
编写一个简单的猜数字游戏。程序随机生成一个 1 到 100 之间的数字,用户输入猜测的数字,程序根据用户的输入给出提示(太大或太小),直到用户猜对为止。
use rand::Rng;
use std::io;
fn main() {
let secret_number = rand::thread_rng().gen_range(1..=100);
loop {
let mut guess = String::new();
println!("Please input your guess.");
io::stdin()
.read_line(&mut guess)
.expect("Failed to read line");
let guess: u32 = match guess.trim().parse() {
Ok(num) => num,
Err(_) => continue,
};
println!("You guessed: {}", guess);
match guess.cmp(&secret_number) {
std::cmp::Ordering::Less => println!("Too small!"),
std::cmp::Ordering::Greater => println!("Too big!"),
std::cmp::Ordering::Equal => {
println!("You win!");
break;
}
}
}
}
练习 2: 斐波那契数列
编写一个程序,输出斐波那契数列的前 20 个数字。
fn main() {
let mut a = 0;
let mut b = 1;
for _ in 0..20 {
println!("{}", a);
let temp = a;
a = b;
b = temp + b;
}
}
练习 3: 计算阶乘
编写一个程序,计算并输出一个数字的阶乘。
fn main() {
let number = 5;
let mut factorial = 1;
for i in 1..=number {
factorial *= i;
}
println!("The factorial of {} is {}", number, factorial);
}
总结
通过本教程,你学习了 Rust 中的四种基本控制流结构:if、loop、while 和 for。这些结构是编程中的基础,掌握它们将帮助你编写更加灵活和功能强大的程序。通过实践练习,你可以更好地理解和应用这些概念。继续探索 Rust 的其他特性,你会发现这门语言的强大之处。