手记

跟老卫学仓颉编程语言开发:流程控制

2026-01-12 08:07:2151浏览

老卫

2实战 · 261手记 · 2推荐

仓颉程序是从上而下顺序执行的,在此过程中,可以通过分支、循环等流程控制方式,更好的实现相应的功能。

在仓颉编程语言中,条件表达式分为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 表达式将按如下规则执行:

  1. 计算“条件”表达式,如果值为true则转到第2步,值为false则转到第3步。
  2. 执行“分支 1”,转到第4步。
  3. 执行“分支 2”,转到第4步。
  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 表达式将按如下规则执行:

  1. 计算“条件”表达式,如果值为true则转第2步,值为false转第3步。
  2. 执行“循环体”,转第1步。
  3. 结束循环,继续执行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表达式将按如下规则执行:

  1. 计算“序列”表达式,将其值作为遍历对象,并初始化遍历对象的迭代器。
  2. 更新迭代器,如果迭代器终止,转第4步,否则转第3步。
  3. 将当前迭代器指向的数据与“迭代变量”绑定,并执行“循环体”,转第2步。
  4. 结束循环,继续执行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 表达式将按如下规则执行:

  1. 执行“循环体”,转第2步。
  2. 计算“条件”表达式,如果值为true则转第1步,值为false转第3步。
  3. 结束循环,继续执行do-while表达式后面的代码。

示例如下:

// do-while循环
var number4 = 1;
do {
    println("number4: ${number4}");
    number4 += 1;
} while (number4 != 4)

上述例子执行之后输出内容如下:

number4: 1
number4: 2
number4: 3

参考引用

0人推荐
随时随地看视频
慕课网APP