for 循环语句
语法
| 形式 | 语法 |
|---|---|
| 1 | for ( 语句 | 变量声明 表达式? ; 表达式? ) 语句 | ({ 语句列表 }) |
| 2 | for ( 变量声明 upto|downto 表达式 ; 表达式? ) 语句 | ({ 语句列表 }) |
| 3 | for ( 不带初始值的 变量声明 : 表达式 ) 语句 | ({ 语句列表 }) |
描述
for 循环语句用于重复执行一段代码块,直到满足特定的终止条件。它提供了两种主要的语法形式:
初始化;条件;步进循环
这种形式是最传统的 for 循环语法,类似于 C 语言中的 for 循环。它包含三个部分:
- 初始化:在循环开始前执行的语句,通常用于初始化循环变量。
- 条件:在每次循环迭代开始时评估的表达
- 步进:在每次循环迭代结束时执行的表达式,通常用于更 新循环变量。
初始化表达式将在循环进入时被执行求值一次,接下来每次循环开始时,都检查条件表达式的值,如果条件为真,则执行循 环体,然后执行步进表达式。这个过程会一直持续,直到条件表达式的值为假。
可以使用 continue 语句 来跳过当前迭代并开始下一次迭代,或者使
用 break 语句 来提前退出循环。执行 continue 语句时,步进表达式仍然会被执行,
执行 break 语句时,循环会立即终止,步进表达式不会被执行。
条件表达式可以是一个空语句,这表示此循环的循环条件始终成立:
for (int i = 0; ; ++i) {
// 这个循环将无限执行,直到通过 break 语句退出
if (i >= 10) {
break;
}
writeln(i);
}
upto/downto 循环
这种形式的 for 循环语句用于在一个范围内迭代,类似于 Python 中的 range 函数。它包含两个主要部分:
- 变量声明:用于声明循环变量,并通过初始值指示循环的起始点。
- 终止位置:指示范围的结束位置,可以是
upto(向上迭代)或downto(向下迭代)。
upto 和 downto 关键字用于指定循环变量的迭代方向。upto 表示从起始值递增到终止位置,而 downto 则表示从起
始值递减到终止位置。每次步进的值是 1。
upto 和 downto 循环本质上是语法糖,以下写法实际上是等价的:
for (int i = 0; i <= 10; ++i) {
// 循环体
}
// 等价于
for (int i = 0 upto 10) {
// 循环体
}
因此,upto 和 downto 循环同样支持使用 continue 语句 和 break 语句。
迭代遍历循环
这种形式的 for 循环语句用于遍历 array 或 map。可以从 array 或 map 中依次取出元素,并在循环体内
使用这些元素。
-
如果遍历的是
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);
}