前言
程序是由语句构成,而流程控制语句 是用来控制程序中每条语句执行顺序的语句。可以通过控制语句实现更丰富的逻辑以及更强大的功能。几乎所有编程语言都有流程控制语句,功能也都基本相似。
其流程控制方式有
- 顺序结构
- 分支结构
- 循环结构
这里最简单最常用的就是顺序结构,即语句从上至下一一执行。
1. 分支语句
顺序结构的程序虽然能解决计算、输出等问题,但不能做判断再选择。对于要先做判断再选择的问题就要使用分支结构。
1.1 单分支语句
语法:
if 布尔表达式 { // 注意左花括号必须与表达式同行
/* 在布尔表达式为 true 时执行 */
}
案例一:
package main
import "fmt"
func main() {
var user = "jiangtao"
var passwd = 123
if user == "tao" && passwd == 123 {
fmt.Println("登陆成功")
}
fmt.Println("登陆失败")
}
执行结果:
解析:
此处不能存在这种写法:
if user == “tao” && passwd = 123 这种写法会报错,在判断是否相等的时候用==,而不是=
改写下,让用户输入
package main
import "fmt"
func main() {
var user string
var passwd string
fmt.Println("请输入用户名:")
fmt.Scanln(&user)
fmt.Println("请输入密码:")
fmt.Scanln(&passwd)
if user == "laoxin" && passwd == "123" {
fmt.Println("登陆成功")
}
fmt.Println("登陆失败")
}
但这个地方需要注意,因为是单分支语句,他输出登陆成功后,还是会输出登陆失败,。
但登陆失败一定不会执行登陆成功的语句。
如果要实现更多功能需要用到双分支语句:
双分支语句
语法错误
if 布尔表达式 { // 注意左花括号必须与表达式同行
/* 在布尔表达式为 true 时执行 */
} else{
}
案例一:
package main
import "fmt"
func main() {
var user string
var passwd string
fmt.Println("请输入用户名:")
fmt.Scanln(&user)
fmt.Println("请输入密码:")
fmt.Scanln(&passwd)
if user == "laoxin" && passwd == "123" {
fmt.Println("登陆成功")
} else {
fmt.Println("登陆失败")
}
}
注意语法格式,{}的位置不能变
花括号里面可以写多行代码,这是一个语句体
3. 多分支语句
语法格式:
if 布尔表达式 { // 注意左花括号必须与表达式同行
/* 在布尔表达式为 true 时执行 */
} else if{
}else if{
}else if{
}else{
}
突然想起了香蕉这个单词, banananananana
最后一定要有个else,要不然上面的都不执行
案例一:
成绩是否合格
package main
import "fmt"
func main() {
var score int
fmt.Println("请输入你的成绩:")
fmt.Scanln(&score)
if score > 90 && score <= 100 {
fmt.Println("成绩优秀")
} else if score > 80 && score <= 90 {
fmt.Println("成绩良好")
} else if score > 60 && score <= 80 {
fmt.Println("成绩及格")
} else {
fmt.Println("成绩不及格")
}
}
执行结果:
是否存在bug呢?
比如成绩是200分
所以成绩应该不能大于100,也不能小于0
修改v2版本
package main
import "fmt"
func main() {
var score int
fmt.Println("请输入你的成绩:")
fmt.Scanln(&score)
if score > 100 || score < 0 {
fmt.Println("你输入的成绩超出了范围,请输入0-100之间的数字")
} else if score > 90 && score <= 100 {
fmt.Println("成绩优秀")
} else if score > 80 && score <= 90 {
fmt.Println("成绩良好")
} else if score > 60 && score <= 80 {
fmt.Println("成绩及格")
} else {
fmt.Println("成绩不及格")
}
}
执行结果
在想一个问题: 代码是从上往下进行,比如 一个成绩大于100, 就一定会执行第一个分支,不会执行到第二个分支。
所以我们写 score > 90 score< 100 这个小于100是否有必要。
很明显没有必要,可以改一下,改成score > 90 , 但这样少了90 。 所以需要改成score >=90
V3版
package main
import "fmt"
func main() {
var score int
fmt.Println("请输入你的成绩:")
fmt.Scanln(&score)
if score > 100 || score < 0 {
fmt.Println("你输入的成绩超出了范围,请输入0-100之间的数字")
} else if score >= 90 {
fmt.Println("成绩优秀")
} else if score >= 80 {
fmt.Println("成绩良好")
} else if score >=60 {
fmt.Println("成绩及格")
} else {
fmt.Println("成绩不及格")
}
}
注意,代码不管有多少行,都是执行一个分支
其他分支语句 switch
语法:
switch var {
case val1:
...
case val2:
...
default:
...
}
switch语句也是多分支选择语句,执行哪一代码块,取决于switch后的值与哪一case值匹配成功,则执行该case后的代码块。
案例:
数字对应星期
package main
import "fmt"
func main() {
var num int
fmt.Scanln(&num)
switch num {
case 1:
fmt.Println("今天星期一")
case 2:
fmt.Println("今天星期二")
case 3:
fmt.Println("今天星期三")
case 4:
fmt.Println("今天星期四")
case 5:
fmt.Println("今天星期五")
case 6:
fmt.Println("今天星期六")
}
}
switch的特点:
1、switch比if else更为简洁
2、执行效率更高。switch…case会生成一个跳转表来指示实际的case分支的地址,而这个跳转表的索引号与switch变量的值是相等的。从而,switch…case不用像if…else那样遍历条件分支直到命中条件,而只需访问对应索引号的表项从而到达定位分支的目的。
3、到底使用哪一个选择语句,代码环境有关,如果是范围取值,则使用if else语句更为快捷;如果是确定取值,则使用switch是更优方案
在上面的switch中如果出现不匹配的怎么办呢?
语法:
switch{
case 1,2:
default:
}
完善后案例代码:
package main
import "fmt"
func main() {
var num int
fmt.Scanln(&num)
switch num {
case 1:
fmt.Println("今天星期一")
case 2:
fmt.Println("今天星期二")
case 3:
fmt.Println("今天星期三")
case 4:
fmt.Println("今天星期四")
case 5:
fmt.Println("今天星期五")
case 6:
fmt.Println("今天星期六")
case 7, 0:
fmt.Println("今天星期日")
default:
fmt.Println("数字不合法")
}
}
总结
流程控制语句,在后面的课程中会用的比较多,是学习的重点。