跳到主要内容
版本:master

for 循环语句

语法

形式语法
1for ( 语句 | 变量声明 表达式? ; 表达式? ) 语句 | ({ 语句列表 })
2for ( 变量声明 upto|downto 表达式 ; 表达式? ) 语句 | ({ 语句列表 })
3for ( 不带初始值的 变量声明 : 表达式 ) 语句 | ({ 语句列表 })

描述

for 循环语句用于重复执行一段代码块,直到满足特定的终止条件。它提供了两种主要的语法形式:

初始化;条件;步进循环

这种形式是最传统的 for 循环语法,类似于 C 语言中的 for 循环。它包含三个部分:

  1. 初始化:在循环开始前执行的语句,通常用于初始化循环变量。
  2. 条件:在每次循环迭代开始时评估的表达
  3. 步进:在每次循环迭代结束时执行的表达式,通常用于更新循环变量。

初始化表达式将在循环进入时被执行求值一次,接下来每次循环开始时,都检查条件表达式的值,如果条件为真,则执行循 环体,然后执行步进表达式。这个过程会一直持续,直到条件表达式的值为假。

可以使用 continue 语句 来跳过当前迭代并开始下一次迭代,或者使 用 break 语句 来提前退出循环。执行 continue 语句时,步进表达式仍然会被执行, 执行 break 语句时,循环会立即终止,步进表达式不会被执行。

条件表达式可以是一个空语句,这表示此循环的循环条件始终成立:

for (int i = 0; ; ++i) {
// 这个循环将无限执行,直到通过 break 语句退出
if (i >= 10) {
break;
}
writeln(i);
}

upto/downto 循环

这种形式的 for 循环语句用于在一个范围内迭代,类似于 Python 中的 range 函数。它包含两个主要部分:

  1. 变量声明:用于声明循环变量,并通过初始值指示循环的起始点。
  2. 终止位置:指示范围的结束位置,可以是 upto(向上迭代)或 downto(向下迭代)。

uptodownto 关键字用于指定循环变量的迭代方向。upto 表示从起始值递增到终止位置,而 downto 则表示从起 始值递减到终止位置。每次步进的值是 1。

uptodownto 循环本质上是语法糖,以下写法实际上是等价的:

for (int i = 0; i <= 10; ++i) {
// 循环体
}

// 等价于

for (int i = 0 upto 10) {
// 循环体
}

因此,uptodownto 循环同样支持使用 continue 语句break 语句

迭代遍历循环

这种形式的 for 循环语句用于遍历 arraymap。可以从 arraymap 中依次取出元素,并在循环体内 使用这些元素。

  • 如果遍历的是 array

    当遍历 array 时,遍历循环里可以声明 一个 变量用以接收每次迭代时的元素值。 声明这个变量时,应当确保类型可以正确接收元素;如果数组中 存在不兼容类型的元素,则遍历到该元素时抛出异常:

    array arr = [1, 2, 3, "str", 4, 5];
    for (int value : arr) {
    writeln(value); // 依次输出 1, 2, 3,当遍历到 "str" 时抛出异常
    }
  • 如果遍历的是 map

    当遍历 map 时,遍历循环可以接收 一个两个 变量:

    变量数说明
    1接收一个数组,数组按顺序包含:[键, 值, 索引顺序]
    2第一个变量接收键,第二个变量接收值
    map m = {"a": 1, "b": 2, "c": 3};
    // 使用一个变量接收键值对数组
    for (array entry : m)
    {
    let string key, int value, int index = entry;
    writeln("Key: ", key, ", Value: ", value, ", Index: ", index);
    }

    // 使用两个变量分别接收键和值
    for (string key, int value : m)
    {
    writeln("Key: ", key, ", Value: ", value);
    }

在迭代遍历循环中,可以使用内建变量 __index 来获取当前迭代的索引位置(从 0 开始)。这个变量在每次迭代时自动更新,表示当前元素在集合中的位置。

与其他形式的 for 循环类似,迭代遍历循环也支持使用 continue 语句break 语句

示例

// 初始化;条件;步进循环示例
for (int i = 0; i < 5; ++i)
{
writeln("i = ", i);
}

// upto 循环示例
for (int j = 0 upto 4)
{
writeln("j = ", j);
}

// downto 循环示例
for (int k = 4 downto 0)
{
writeln("k = ", k);
}

// 数组遍历示例
array numbers = [10, 20, 30, 40, 50];
for (int num : numbers)
{
writeln("数组元素: ", num, ", 索引: ", __index);
}

// map 遍历示例(一个变量)
map scores = {"Alice": 95, "Bob": 87, "Charlie": 92};
for (array entry : scores)
{
writeln("条目: ", entry);
}

// map 遍历示例(两个变量)
for (string name, int score : scores)
{
writeln("姓名: ", name, ", 分数: ", score, ", 索引: ", __index);
}

// 使用 continue 和 break 的示例
for (int i = 0; i < 10; ++i) {
if (i == 3) {
continue; // 跳过 i = 3 的情况
}
if (i == 7) {
break; // 当 i = 7 时退出循环
}
writeln("当前值: ", i);
}