if (条件) { 分支 1 } else { 分支 2 } 其中“条件”是布尔类型表达式,“分支 1”和“分支 2”是两个代码块。if 表达式将按如下规则执行:
在一些场景中,我们可能只关注条件成立时该做些什么,所以 else 和对应的代码块是允许省略的
var num = 10 if (num % 2 ==0){ println("偶数") } 在这段程序中,我们使用仓颉标准库的 random 包生成了一个随机整数,然后使用 if 表达式判断这个整数是否能被 2 整除,并在不同的条件分支中打印“偶数”或“奇数”。
import std.random.* main() { let number: Int8 = Random().nextInt8() println(number) if (number % 2 == 0) { println("偶数") } else { println("奇数") } } 注意 : 仓颉编程语言是强类型的,if 表达式的条件只能是布尔类型,不能使用整数或浮点数等类型,和 C 语言等不同,仓颉不以条件取值是否为 0 作为分支选择依据,例如以下程序将编译报错:
main() { let number = 1 if (number) { // Error, mismatched types println("非零数") } } 在许多场景中,当一个条件不成立时,我们可能还要判断另一个或多个条件、再执行对应的动作,仓颉允许在 else 之后跟随新的 if 表达式,由此支持多级条件判断和分支执行,例如:
import std.random.* main() { let speed = Random().nextFloat64() * 20.0 println("${speed} km/s") if (speed > 16.7) { println("第三宇宙速度,鹊桥相会") } else if (speed > 11.2) { println("第二宇宙速度,嫦娥奔月") } else if (speed > 7.9) { println("第一宇宙速度,腾云驾雾") } else { println("脚踏实地,仰望星空") } } if 表达式的值与类型,需要根据使用形式与场景来确定:
当含 else 分支的 if 表达式被求值时,需要根据求值上下文确定 if 表达式的类型:
如果编译通过,则 if 表达式的值就是所执行分支代码块的值。
如果含 else 分支的 if 表达式没有被求值,在这种场景里,开发者一般只想在不同分支里做不同操作,不会关注各分支最后一个表达式的值与类型,为了不让上述类型检查规则影响这一思维习惯,仓颉规定这种场景下的 if 表达式类型为 Unit、值为 (),且各分支不参与上述类型检查。
对于不含 else 分支的 if 表达式,由于 if 分支也可能不被执行,所以我们规定这类 if 表达式的类型为 Unit、值为 ()。
let zero: Int8 = 0 let one: Int8 = 1 let voltage = 5.0 let bit = if (voltage < 2.5) { zero } else { one } 如上述列子if表达式会返回相应类型的数据 , 如果执行if后则会返回if得到的值 , 反之返回else得到的值
在以上程序中,if 表达式作为变量定义的初值使用,由于变量 bit 没有被标注类型、需要从初值中推导,所以 if 表达式的类型取为两个分支代码块类型的最小公共父类型,根据前文对“代码块”的介绍,可知两个分支代码块类型都是 Int8,所以 if 表达式的类型被确定为 Int8,其值为所执行分支即 else 分支代码块的值,所以变量 bit 的类型为 Int8、值为 1。