仓颉编程入门 – if 表达式
一. if 表达式的基本形式
if (条件) {
分支 1
} else {
分支 2
}
在if
表达式中,有一个“条件”表达式,它是布尔类型的,用于判断接下来的执行路径。此外,还有“分支 1”和可选的“else 分支”(即“分支 2”)作为两个可能的代码块。if
表达式的执行流程如下:
- 计算“条件”表达式的值。如果值为
true
,则执行第2步;如果值为false
,且存在“else 分支”,则执行第3步;如果值为false
且没有“else 分支”,则直接跳转到第4步。 - 执行“分支 1”中的代码。完成后,无论“条件”表达式的结果如何,都将跳转到第4步。
- (可选)如果存在“else 分支”,则在“条件”表达式为
false
时执行“else 分支”中的代码。完成后,跳转到第4步。 - 继续执行
if
表达式后面的代码。
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 表达式的值有明确的类型要求(如类型 T)时,if 表达式的每个分支(包括 else 分支)必须返回一个 T 的子类型值。此时,if 表达式的整体类型即为 T。若不满足这一子类型约束,则编译时会报错。
若上下文没有明确的类型要求,则 if 表达式的类型将基于其各个分支返回值的类型来确定,具体为这些类型之间的最小公共父类型。若不存在这样的类型,则编译会报错。
值确定:若编译通过,if 表达式的值将等于实际执行分支的返回值。
含 else 分支但未被求值的 if 表达式:
在这种情况下,开发者通常关注的是 if 表达式内不同分支所执行的操作,而非其返回值。因此,为了避免类型检查规则对此类用法造成不必要的限制,我们规定此类 if 表达式的类型为 Unit,且其值为空元组 ()。同时,各分支的返回值类型及值将不参与上述类型检查过程。
不含 else 分支的 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
分支和else
分支)返回值的类型来确定的,具体为这两个类型之间的最小公共父类型。
考虑以下情况:
- 变量
bit
没有被显式标注类型,因此其类型将从if
表达式的初值中推导。 - 在这个
if
表达式中,if
分支和else
分支都包含代码块,且根据之前的说明,这两个代码块的类型都是Int8
。 - 由于两个分支的代码块类型相同(均为
Int8
),因此if
表达式的类型被直接确定为Int8
。 - 变量
bit
的值将由if
表达式决定。如果if
条件为真,则bit
的值将是if
分支代码块的返回值;如果if
条件为假,则bit
的值将是else
分支代码块的返回值。
根据这个逻辑,如果if
条件不满足(即执行了else
分支),那么变量bit
的类型将被推导为Int8
,且其值将为else
分支代码块返回的值,即1
。
总结来说,变量bit
的类型为Int8
,其值为1
,这是基于if
表达式中else
分支代码块的返回值和类型推导规则得出的。