仓颉程序是从上而下顺序执行的,在此过程中,可以通过分支、循环等流程控制方式,更好的实现相应的功能。
在仓颉编程语言中,条件表达式分为if表达式和if-let表达式两种,它们的值与类型需要根据使用场景来确定。循环表达式有四种:for-in表达式、while表达式、do-while表达式和while-let表达式,它们的类型都是Unit、值为()。其中if-let表达式和while-let表达式都与模式匹配相关。
在仓颉程序中,由一对大括号“{}”包围起来的一组表达式,被称为“代码块”,它将作为程序的一个顺序执行流,其中的表达式将按编码顺序依次执行。如果代码块中有至少一个表达式,我们规定此代码块的值与类型等于其中最后一个表达式的值与类型,如果代码块中没有表达式,规定这种空代码块的类型为Unit、值为()。
注:代码块本身不是一个表达式,不能被单独使用,它将依附于函数、条件表达式和循环表达式等执行和求值。
本节示例可以在“flow_control_demo”应用下找到。
分支
在仓颉里,分支主要通过if表达式来控制。if 表达式的基本形式为:
if (条件) {
分支 1
} else {
分支 2
}
其中“条件”是布尔类型表达式,“分支 1”和“分支 2”是两个代码块。if 表达式将按如下规则执行:
- 计算“条件”表达式,如果值为true则转到第2步,值为false则转到第3步。
- 执行“分支 1”,转到第4步。
- 执行“分支 2”,转到第4步。
- 继续执行if表达式后面的代码。
以下是if表达式进行分支控制的示例:
/// 流程控制示例
import std.random.*
main() {
// 生成随机数
let number: Int8 = Random().nextInt8()
if (number % 2 == 0) {
println("${number} is an even number")
} else {
println("${number} is an odd number")
}
}
在这段程序中,使用仓颉标准库的random包生成了一个随机整数,然后使用if表达式判断这个整数是否能被2整除,从而判断该数是偶数或奇数。
上述例子执行多次之后可能输出内容如下:
101 is an odd number
-58 is an even number
-69 is an odd number
在上述程序中有条件if语句,这个语法在很多其它语言中很常见,重点是:条件表达式需要用小括号包裹。
仓颉还是支持传统的else-if语法的,实现多重条件的处理。示例如下:
// 处理多重条件
let number2: Int8 = Random().nextInt8();
if (number2 % 4 == 0) {
println("${number2} is divisible by 4");
} else if (number2 % 3 == 0) {
println("${number2} is divisible by 3");
} else if (number2 % 2 == 0) {
println("${number2} is divisible by 2");
} else {
println("${number2} is not divisible by 4, 3, or 2");
}
上述例子执行之后输出内容如下:
-115 is not divisible by 4, 3, or 2
22 is divisible by 2
27 is divisible by 3
92 is divisible by 4
循环
多次执行同一段代码是很常用的,仓颉为此提供了4种循环:for-in表达式、while表达式、do-while表达式和while-let表达式。
1. while
如果你需要一个条件来循环,当该条件为true时,继续循环,条件为false,跳出循环,那么while就非常适用。while表达式的基本形式为:
while (条件) {
循环体
}
其中“条件”是布尔类型表达式,“循环体”是一个代码块。while 表达式将按如下规则执行:
- 计算“条件”表达式,如果值为true则转第2步,值为false转第3步。
- 执行“循环体”,转第1步。
- 结束循环,继续执行while表达式后面的代码。
示例如下:
// while循环
var number3 = 1;
while (number3 != 4) {
println("number3: ${number3}");
number3 += 1;
}
该while循环,只有当number不等于4时,才执行,否则就立刻跳出循环。因此在上述代码中,它会先从1开始,满足条件,进行循环;然后是2,满足条件,进行循环;最终到4的时候,不满足条件,跳出while循环。
上述例子执行之后输出内容如下:
number3: 1
number3: 2
number3: 3
2. for-in
for-in表达式是最常用的循环结构,常用来遍历一个线性数据结构(比如数组、集合)。for-in表达式的基本形式为:
for (迭代变量 in 序列) {
循环体
}
其中“循环体”是一个代码块。“迭代变量”是单个标识符或由多个标识符构成的元组,用于绑定每轮遍历中由迭代器指向的数据,可以作为“循环体”中的局部变量使用。“序列”是一个表达式,它只会被计算一次,遍历是针对此表达式的值进行的,其类型必须扩展迭代器接口Iterable<T>。for-in表达式将按如下规则执行:
- 计算“序列”表达式,将其值作为遍历对象,并初始化遍历对象的迭代器。
- 更新迭代器,如果迭代器终止,转第4步,否则转第3步。
- 将当前迭代器指向的数据与“迭代变量”绑定,并执行“循环体”,转第2步。
- 结束循环,继续执行for-in表达式后面的代码。
示例如下:
// for-in循环
let array = [10, 20, 30, 40, 50];
for (number in array) {
println("number: ${number}");
}
这个程序中的for-in表达式完成了对数组array的遍历。
上述例子执行之后输出内容如下:
number: 10
number: 20
number: 30
number: 40
number: 50
3. do-while
do-while 表达式的基本形式为:
do {
循环体
} while (条件)
其中“条件”是布尔类型表达式,“循环体”是一个代码块。do-while 表达式将按如下规则执行:
- 执行“循环体”,转第2步。
- 计算“条件”表达式,如果值为true则转第1步,值为false转第3步。
- 结束循环,继续执行do-while表达式后面的代码。
示例如下:
// do-while循环
var number4 = 1;
do {
println("number4: ${number4}");
number4 += 1;
} while (number4 != 4)
上述例子执行之后输出内容如下:
number4: 1
number4: 2
number4: 3
参考引用
- 示例源码,见免费开源书《跟老卫学仓颉编程语言开发》
- 免费开源书《跟老卫学HarmonyOS开发》
- HarmonyOS NEXT+AI大模型打造智能助手APP(仓颉版)(视频)
- 仓颉编程从入门到实践(北京大学出版社)
共同学习,写下你的评论
评论加载中...
作者其他优质文章

