仓颉编程入门 -- if 表达式使用详解

仓颉编程入门 – if 表达式

一. if 表达式的基本形式

if (条件) {
  分支 1
} else {
  分支 2
}

if表达式中,有一个“条件”表达式,它是布尔类型的,用于判断接下来的执行路径。此外,还有“分支 1”和可选的“else 分支”(即“分支 2”)作为两个可能的代码块。if表达式的执行流程如下:

  1. 计算“条件”表达式的值。如果值为true,则执行第2步;如果值为false,且存在“else 分支”,则执行第3步;如果值为false且没有“else 分支”,则直接跳转到第4步。
  2. 执行“分支 1”中的代码。完成后,无论“条件”表达式的结果如何,都将跳转到第4步。
  3. (可选)如果存在“else 分支”,则在“条件”表达式为false时执行“else 分支”中的代码。完成后,跳转到第4步。
  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分支代码块的返回值和类型推导规则得出的。

  • 11
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

攒了一袋星辰

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值