【图书介绍】《Rust编程与项目实战》-CSDN博客
《Rust编程与项目实战》(朱文伟,李建英)【摘要 书评 试读】- 京东图书 (jd.com)
Rust编程与项目实战_夏天又到了的博客-CSDN博客
Rust语言实现选择结构时,根据某种条件的成立与否而采用不同的程序段进行处理的程序结构称为选择结构。通常选择结构有两个分支,条件为“真”,执行甲程序段,否则执行乙程序段。有时,两个分支还不能完全描述实际问题。例如,判断学生的成绩属于哪个等级(A:90~100,B:80~89,C:60~79,D:0~59),根据学生的成绩的条件分成4个分支,分别处理各等级的情况。这样的程序结构称为多分支选择结构。
Rust语言中的if选择语句分为3种:单分支结构(if语句)、双分支结构(if…else语句) 和多分支结构(if…else if语句)。通过使用关键字if或if…else、if…else if…else加上条件语句来实现。
5.1.1 单分支if语句
if语句是最简单的选择语句,它实现程序的单分支执行路径。其语法格式如下:
if 条件表达式 {
代码段
}
它表示“条件表达式”为true时执行花括号内的“代码段”内容,否则将跳过“代码段”,执行if语句的下一条语句。代码段可以是一条语句,也可以是多条语句,但都必须用花括号括起来。
注意:if后面的“条件表达式”是不需要圆括号的。另外,即使“代码段”仅有一条语句,也需要用花括号括起来。也就是说,花括号不能省略。这两点和C/C++不同。
另外需要注意的是,代码中的条件表达式必须产生一个 bool 类型的值,否则会触发变异错误。与C/C++或JavaScript等语言不同,Rust不会自动尝试将非布尔类型的值转换为布尔类型,必须显式地在 if 表达式中提供一个布尔类型作为条件。
下面的代码当输入为偶数时输出even:
fn main() {
let num: i32 = 8;
if num % 2 == 0 { //8可以整除2
println!("even");
}
}
因为8可以整除2,所以8%2的结果是0,从而执行花括号中的println!("even");。
看个例子,求给定整数的绝对值。
算法设计:求x的绝对值的算法很简单,若x≥0,则x即为所求:若x< 0,则−x为x的绝对值。程序中首先定义整型变量x和y,其中y存放x的绝对值。输入x的值之后,执行y=x;语句,即先假定x≥ 0,然后判断x是否小于0,若x<0,则x的绝对值为−x,将−x赋给y(y中原来的x值被“冲”掉了)后输出结果y。若x≥0,则跳过y=−x;语句,直接输出结果。此时y中的值仍然是原x的值。程序代码如下:
fn main() {
let x: i32 = -8; //给定一个整数
let mut y=x;
if x < 0
{
y=-x; //若x< 0,则-x为x的绝对值
}
print!("|x|={}",y); //程序输出:|x|=8
}
5.1.2 双分支if…else语句
单分支if语句只指出条件为true时做什么,而未指出条件为false时做什么。if…else语句明确指出作为控制条件的表达式为true时做什么,为false时做什么。语法格式如下:
if 条件表达式 {
代码段1
} else {
代码段2
}
计算条件表达式的值时,若表达式的值为true,则执行代码段1,并跳过代码段2,然后继续执行if…else语句的下一条语句,若表达式的值为false,则跳过代码段1,执行代码段2,然后继续执行if…else语句的下一条语句。
下面的代码当num为偶数时输出even,当num为奇数时输出odd:
fn main() {
let num: i32 = 5;
if num % 2 == 0 {
println!("even");
} else {
println!("odd");
}
}
因为5是奇数,所以整除2的结果不是0,结果输出odd。
我们再来看求两个数中的最大值,代码如下:
fn main() {
let x: f32 = 5.6;
let y=7.8;
if x>y
{
println!("max={}",x);
} else {
println!("max={}",y);
}
}
结果输出:max=7.8。
5.1.3 多分支if语句
多分支语句是对同一个条件表达式的不同结果分别执行不同的代码块。比如判断一个整数是正数、负数还是0,那么就有3种情况:若大于0,则输出正数;若小于0,则输出负数;若等于0,则输出零。这种情况就使用if多分支语句来判断。
if多分支语句的语法格式如下:
if 条件表达式1
{
代码段1;
}
else if 条件表达式2
{
代码段2;
}
…
else if 条件表达式n
{
代码段n;
}
if 多分支结构执行过程的本质就是:若满足则执行,否则不执行。从语法上分析就是:判断条件表达式1的取值,若条件表达式1的值为true,则执行代码段1。若条件表达式1的值为false,则代码段1不会被执行,继续判断条件表达式2的取值,若条件表达式2的值为true,则执行代码段2。若条件表达式n前面所有的条件表达式取值都为false,则会判断表达式n的取值,若条件表达式n的取值为true,则执行语句n;若条件表达式n的取值为false(或不为1),则整个if结构都不会被执行。这种情况下,该结构的存在多半没有意义。如果n个条件都不满足,但还是想让程序执行这n种条件外的其他情况,那么可以在最后加一个else:
if 条件表达式1
{
代码段1;
}
else if 条件表达式2
{
代码段2;
}
…
else if 条件表达式n
{
代码段n;
}
else
{
代码段n+1;
}
此时,当前面n个条件都不为false时,则会执行最后else中的“代码段n+1”。看个例子:
fn main() {
let number = 6;
if number % 4 == 0 {
println!("number is divisible by 4");
} else if number % 3 == 0 {
println!("number is divisible by 3");
} else if number % 2 == 0 {
printin!("number is divisible by 2");
} else {
println!("number is not divisible by 4, 3 or 2");
}
}
number是6,不能被4整除,但可以被3整除,结果输出:number is divisible by 3。然后整个多分支if语句结束。
我们再来看一个例子,用if语句实现计算器程序设计。设计计算器程序使用的是多选择结构,即先判断是否为加法运算,如果是,则执行加法操作,如果不是,继续判断是否为减法运算,如果是,则执行减法操作,如果不是,继续判断是否为乘法运算,如果是,则执行乘法操作,如果不是,则执行除法操作,在执行除法操作时需要进一步判断除数是否为0,若除数为0,则输出data error,若除数不为0,则输出除法运算结果。程序流程图如图5-1所示。
根据程序流程图,我们可以写出计算器的Rust语言程序代码。其代码如下:
fn main() {
let op:char='*';
let c1:f32=3.14;
let c2:f32=2.0;
if op=='+' { print!("{}{}{}={}",c1,op,c2,c1+c2);}
else if op=='-' { print!("{}{}{}={}",c1,op,c2,c1-c2);}
else if op=='*' { print!("{}{}{}={}",c1,op,c2,c1*c2);}
else if op=='/' {
if c2==0.0 {print!("data error");}
else {print!("{}{}{}={}",c1,op,c2,c1/c2)};
}
}
结果输出:3.14*2=6.28。
5.1.4 在let语句中使用if
因为if是一个表达式,所以可以将它放在let语中等号的右边。比如:
fn main() {
let condition = true;
let number = if condition { 5 } else { 6 }; // if else必须返回相同的数据类型
println!("The value of number is: {}", number);
}
结果输出:The value of number is: 5。