Carbon循环语句 #
一、循环概述 #
循环用于重复执行代码块。Carbon提供了 while 循环、for 循环和迭代器等多种循环方式。
二、while循环 #
2.1 基本while循环 #
carbon
var count: i32 = 0;
while (count < 5) {
Print("计数: {0}", count);
count += 1;
}
2.2 while循环条件 #
carbon
var sum: i32 = 0;
var i: i32 = 1;
while (i <= 100) {
sum += i;
i += 1;
}
Print("1到100的和: {0}", sum);
2.3 无限循环 #
carbon
while (true) {
var input: String = ReadInput();
if (input == "exit") {
break;
}
Process(input);
}
2.4 while表达式 #
carbon
var x: i32 = 10;
while (x > 0) {
Print("{0}", x);
x -= 1;
}
Print("发射!");
三、for循环 #
3.1 范围for循环 #
carbon
// 遍历范围
for (i in 0..5) {
Print("i = {0}", i); // 0, 1, 2, 3, 4
}
// 包含结束值
for (i in 0..=5) {
Print("i = {0}", i); // 0, 1, 2, 3, 4, 5
}
3.2 数组遍历 #
carbon
var fruits: [String; 3] = ("苹果", "香蕉", "橙子");
for (fruit in fruits) {
Print("水果: {0}", fruit);
}
3.3 带索引遍历 #
carbon
var items: [i32; 5] = (10, 20, 30, 40, 50);
for (i, item in items.Enumerate()) {
Print("索引 {0}: 值 {1}", i, item);
}
3.4 反向遍历 #
carbon
var items: [i32; 5] = (1, 2, 3, 4, 5);
for (item in items.Reverse()) {
Print("{0}", item); // 5, 4, 3, 2, 1
}
3.5 步长遍历 #
carbon
// 步长为2
for (i in (0..10).Step(2)) {
Print("{0}", i); // 0, 2, 4, 6, 8
}
四、循环控制 #
4.1 break语句 #
break 用于立即退出循环:
carbon
var i: i32 = 0;
while (true) {
Print("{0}", i);
i += 1;
if (i >= 5) {
break; // 退出循环
}
}
Print("循环结束");
4.2 continue语句 #
continue 用于跳过当前迭代,继续下一次:
carbon
for (i in 0..10) {
if (i % 2 == 0) {
continue; // 跳过偶数
}
Print("{0}", i); // 只打印奇数
}
4.3 标签与break #
carbon
outer: for (i in 0..5) {
for (j in 0..5) {
if (i + j == 5) {
break outer; // 跳出外层循环
}
Print("({0}, {1})", i, j);
}
}
4.4 标签与continue #
carbon
outer: for (i in 0..3) {
for (j in 0..3) {
if (j == 1) {
continue outer; // 跳到外层循环的下一次迭代
}
Print("({0}, {1})", i, j);
}
}
五、迭代器 #
5.1 迭代器概念 #
迭代器是遍历集合的标准方式,提供 Next() 方法:
carbon
interface Iterator(ElementType) {
fn Next(me) -> Optional(ElementType);
}
5.2 创建迭代器 #
carbon
var arr: [i32; 5] = (1, 2, 3, 4, 5);
var iter: auto = arr.Iter();
while (true) {
match (iter.Next()) {
case Some(value) => Print("{0}", value);
case None => break;
}
}
5.3 迭代器方法 #
carbon
var numbers: [i32; 5] = (1, 2, 3, 4, 5);
// Map: 转换每个元素
var doubled: [i32] = numbers.Iter().Map(fn (x: i32) -> i32 { return x * 2; });
// Filter: 过滤元素
var evens: [i32] = numbers.Iter().Filter(fn (x: i32) -> bool { return x % 2 == 0; });
// Reduce: 归约
var sum: i32 = numbers.Iter().Reduce(0, fn (a: i32, b: i32) -> i32 { return a + b; });
// Take: 取前N个
var first_three: [i32] = numbers.Iter().Take(3);
// Skip: 跳过前N个
var last_two: [i32] = numbers.Iter().Skip(3);
5.4 链式调用 #
carbon
var numbers: [i32; 10] = (1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
var result: i32 = numbers.Iter()
.Filter(fn (x: i32) -> bool { return x % 2 == 0; }) // 过滤偶数
.Map(fn (x: i32) -> i32 { return x * x; }) // 平方
.Take(3) // 取前3个
.Reduce(0, fn (a: i32, b: i32) -> i32 { return a + b; }); // 求和
Print("结果: {0}", result); // 4 + 16 + 36 = 56
六、循环表达式 #
6.1 for表达式 #
carbon
// 使用for生成数组
var squares: [i32] = for (i in 1..6) yield i * i;
// [1, 4, 9, 16, 25]
6.2 while表达式 #
carbon
// 使用while生成值
var result: i32 = while (condition) {
// ...
yield value;
};
七、实际应用 #
7.1 查找元素 #
carbon
fn Find(arr: [i32], target: i32) -> Optional(i32) {
for (i, value in arr.Enumerate()) {
if (value == target) {
return Some(i);
}
}
return None;
}
var items: [i32; 5] = (10, 20, 30, 40, 50);
match (Find(items, 30)) {
case Some(index) => Print("找到,索引: {0}", index);
case None => Print("未找到");
}
7.2 计算统计 #
carbon
fn CalculateStats(numbers: [f64]) -> (f64, f64, f64) {
var sum: f64 = 0.0;
var min: f64 = f64.Max;
var max: f64 = f64.Min;
for (n in numbers) {
sum += n;
if (n < min) { min = n; }
if (n > max) { max = n; }
}
var avg: f64 = sum / f64(numbers.Length());
return (avg, min, max);
}
var data: [f64; 5] = (1.5, 2.5, 3.5, 4.5, 5.5);
var (avg, min_val, max_val) = CalculateStats(data);
Print("平均: {0}, 最小: {1}, 最大: {2}", avg, min_val, max_val);
7.3 矩阵遍历 #
carbon
var matrix: [[i32; 3]; 3] = (
(1, 2, 3),
(4, 5, 6),
(7, 8, 9)
);
for (row in matrix) {
for (value in row) {
Print("{0} ", value);
}
Print("");
}
7.4 文件处理 #
carbon
fn ProcessFile(filename: String) -> i32 {
var file: File = File.Open(filename);
var line_count: i32 = 0;
for (line in file.Lines()) {
ProcessLine(line);
line_count += 1;
}
file.Close();
return line_count;
}
八、性能优化 #
8.1 避免不必要的迭代 #
carbon
// 好的做法:提前退出
fn Contains(arr: [i32], target: i32) -> bool {
for (value in arr) {
if (value == target) {
return true; // 找到就退出
}
}
return false;
}
// 避免:总是遍历全部
fn ContainsSlow(arr: [i32], target: i32) -> bool {
var found: bool = false;
for (value in arr) {
if (value == target) {
found = true;
}
}
return found;
}
8.2 使用迭代器方法 #
carbon
// 好的做法:使用内置方法
var sum: i32 = numbers.Iter().Sum();
// 避免:手动循环
var sum: i32 = 0;
for (n in numbers) {
sum += n;
}
8.3 减少循环内计算 #
carbon
// 好的做法:循环外计算
var limit: i32 = CalculateLimit();
for (i in 0..limit) {
// ...
}
// 避免:每次迭代都计算
for (i in 0..CalculateLimit()) {
// ...
}
九、最佳实践 #
9.1 选择合适的循环 #
carbon
// 已知次数:使用for
for (i in 0..10) {
Print("{0}", i);
}
// 条件循环:使用while
var input: String;
while (input != "quit") {
input = ReadInput();
}
9.2 避免深层嵌套 #
carbon
// 好的做法:提前返回
fn Process(data: [i32]) -> i32 {
if (data.Length() == 0) {
return 0;
}
for (item in data) {
if (item < 0) {
return -1;
}
}
return ProcessValid(data);
}
// 避免:深层嵌套
fn Process(data: [i32]) -> i32 {
if (data.Length() > 0) {
var valid: bool = true;
for (item in data) {
if (item < 0) {
valid = false;
}
}
if (valid) {
return ProcessValid(data);
}
}
return 0;
}
9.3 使用有意义的循环变量名 #
carbon
// 好的命名
for (row in matrix) {
for (column in row) {
// ...
}
}
// 避免的命名
for (i in matrix) {
for (j in i) {
// ...
}
}
十、常见错误 #
10.1 无限循环 #
carbon
// 错误:忘记更新条件
var i: i32 = 0;
while (i < 10) {
Print("{0}", i);
// 忘记 i += 1;
}
// 正确
var i: i32 = 0;
while (i < 10) {
Print("{0}", i);
i += 1;
}
10.2 边界错误 #
carbon
var arr: [i32; 5] = (1, 2, 3, 4, 5);
// 错误:越界
// for (i in 0..=5) {
// Print("{0}", arr[i]); // i=5时越界
// }
// 正确
for (i in 0..5) {
Print("{0}", arr[i]);
}
10.3 修改迭代集合 #
carbon
var items: [i32; 5] = (1, 2, 3, 4, 5);
// 错误:在迭代中修改集合
// for (item in items) {
// items.Push(item * 2); // 危险
// }
// 正确:创建新集合
var new_items: [i32] = for (item in items) yield item * 2;
十一、总结 #
本章我们学习了:
- while循环:条件循环、无限循环
- for循环:范围遍历、数组遍历、带索引遍历
- 循环控制:break、continue、标签
- 迭代器:创建、方法、链式调用
- 循环表达式:yield生成值
- 性能优化:提前退出、减少计算
- 最佳实践:选择合适循环、避免嵌套
接下来让我们学习Carbon的函数!
最后更新:2026-03-27