HarmonyOS鸿蒙Next中跟老卫学仓颉编程语言开发:流程控制

HarmonyOS鸿蒙Next中跟老卫学仓颉编程语言开发:流程控制 仓颉程序是从上而下顺序执行的,在此过程中,可以通过分支、循环等流程控制方式,更好的实现相应的功能。

在仓颉编程语言中,条件表达式分为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

参考引用


更多关于HarmonyOS鸿蒙Next中跟老卫学仓颉编程语言开发:流程控制的实战教程也可以访问 https://www.itying.com/category-93-b0.html

4 回复

支持支持

更多关于HarmonyOS鸿蒙Next中跟老卫学仓颉编程语言开发:流程控制的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


多谢支持!,

鸿蒙Next的仓颉编程语言中,流程控制包括条件语句(if/else)、循环语句(for/while)和分支语句(match)。这些结构用于控制程序执行顺序,实现逻辑判断和重复操作。具体语法遵循仓颉语言规范,与鸿蒙系统深度集成。

这篇帖子对仓颉编程语言的流程控制讲解得非常清晰和全面。帖子准确地介绍了仓颉中顺序执行、分支和循环的核心概念,并提供了实用的代码示例。

核心要点总结与补充:

  1. 代码块与表达式:帖子正确指出了代码块({})本身不是表达式,其值取决于最后一个表达式的值。这是理解仓颉中if等结构可以返回值的关键。

  2. 分支控制if表达式的语法与传统语言类似,但需要注意条件必须用括号包裹。仓颉的if可以作为表达式使用,其值即为执行分支的最后一个表达式的值,这为函数式风格的编码提供了便利。帖子中提到的if-let表达式是结合模式匹配的高级特性,用于安全地解包可选值(Option<T>)。

  3. 循环控制:帖子详细介绍了四种循环:

    • while:标准的“当型”循环,先判断条件。
    • for-in:用于遍历实现了Iterable<T>接口的集合,是处理集合数据最常用的方式。
    • do-while:“直到型”循环,循环体至少执行一次。
    • while-let:与if-let类似,结合模式匹配,常用于循环处理如迭代器返回Option<T>这类场景,当匹配失败时自动退出循环。

实践提示:

  • for-in循环中,迭代变量默认是不可变的(let)。如果需要修改集合内的元素,可能需要使用其他迭代方式或下标访问。
  • whiledo-while循环需要注意避免无限循环,确保循环条件能在预期内变为false
  • 对于复杂的多重条件判断,除了else-if链,在后续学习中还可以结合match表达式(模式匹配)来使代码更清晰。

帖子内容与官方文档一致,示例代码可以直接运行验证,是学习仓颉流程控制的优秀资料。对于想深入学习的开发者,帖子末尾提供的参考书籍和视频课程是很好的延伸学习路径。

回到顶部