3-1-分支结构
kotlin提供了两个关键字用于表示分支结构,即if和when
if分支
语法:
//第一种形式
if(expression) {
statements...
}
//第二种形式
if(expression) {
statements...
}else {
statements...
}
//第三种形式
if(expression) {
statements...
} else if(expression) {
statements...
} else {
statements...
}
其中else if
可以有多个,上述使用{}
括起来的是代码块, 一个代码块被当作一个整体来执行,除非使用关键字提前退出,如下
return 结束整个方法,可用于循环和分支
break 退出当前代码块,线程继续往下执行,用于循环结构
continue 跳转到下一次执行,用于循环结构 示例代码
fun main() {
val age = 30
if(age>20) {
//只有当age>20时,该代码块才被执行
//使用{}扩起来的代码块是一个整体,要么一起执行,要么都不执行
println("年龄大于20岁")
println("20岁以上的人应该学会承担责任")
}
}
如果代码块只有一条语句,{}
省略
fun main() {
val age = 5
if(age>4)
println("年龄大于4")
else
println(”年龄不大于4“)
}
代码块内可以是1条或多条语句,也可以是0条语句,保留大括号会有更好的可读性 对于if分支,有一个容易出现的逻辑问题,这个问题不属于语法问题,出现错误结果 示例代码
fun main() {
val age = 50
if(age>20) {
println("青年人")
} else if(age>40) {
println("中年人")
} else if(age>60) {
println("老年人")
}
}
从表面上看,程序没有问题,但是结果居然是20岁是青年人,显然出了问题
上述代码等价于如下格式
fun main() {
val age = 50
if(age>20) {
println("青年人")
} else if(age>40 && !(age>20)) {//在原本的if条件中添加了else的隐含条件
println("中年人")
} else if(age>60 && !(age>20) && !(age>40 && !(age>20))) {//在原本的if条件中添加了else的隐含条件
println("老年人")
}
}
而!(age>20)
又可以写成age<=20
,因此age>40 && !(age>20)
又可以改写写成age>40&&age<=20
。 正确的判断逻辑:
当age>60,判断为"老年人"
当age>40,并且age<=60即!(age>60),判断为"中年人"
当age>20,并且age<=40即!(age>40),判断为"青年人" 因此当使用if-else语句进行流程控制时,一定不要忽略了else所带的隐含条件 如果每次都需要去计算if和else的交集是一件很繁琐的事情 为避免上述错误情况,在使用if-else时有一条基本规则:
总是优先把包含范围小的条件放到前面处理 ,如age>60和age>20,明显age>60的范围更小,因此应该先处理age>60的情况
if表达式
Kt的if可以作为表达式使用。也就是说,整个if-else最终会返回一个值,因此if可以代替Java的三目运算符?:
, 例如:
fun main() {
val age = 20
//将if表达式赋值给变量
val str = if(age>18) "大于18岁" else if(age<18) "小于18岁" else "等于20岁"
println(str)
}
如果分支包含多条语句,此时代码块最后一条语句作为整个代码块的值, 例如:
fun main() {
val age = 20
//将if表达式赋值给变量
val str = if(age>18) {
println("大于18的分支")
"大于18岁"
} else if(age<18) {
println("小于18的分支")
"小于18岁"
} else {
println("等于18的分支")
"等于18岁"
}
println(str)
}
/*
打印结果:
大于18的分支
大于18岁
*/