在C#里,for循环是最基础的计数控制结构,用来在明确知道重复次数的情况下反复执行同一段代码。它由三个部分组成,分别控制循环的起点、继续条件和步进方式,编译器按顺序在每次迭代前后处理这些表达式。

for循环的基本语法
for循环的写法固定为for (初始化; 条件; 迭代),后接一个语句块。初始化部分只在进入循环前执行一次,通常用来声明并赋值计数器;条件部分在每轮循环开始前求值,为真才继续;迭代部分在每轮循环体执行完后运行,一般对计数器自增或自减。
下面是一段最基础的从0数到4的示例,注意计数器i的作用域仅限于for括号内和循环体,出了循环就不能再用。
for (int i = 0; i < 5; i++)
{
Console.WriteLine("当前数字:" + i);
}
这段代码中,i从0开始,每次循环结束加1,当i等于5时条件i < 5不成立,循环停止。很多新手会误把条件写成i <= 5,导致多输出一次,或者把i++漏掉造成死循环,这些都属于对三段式执行顺序理解不清。
与while循环的差异和选型
同样的逻辑用while也能实现,但for把计数器相关操作收拢在一行,可读性更高。while更适合不确定次数的场景,比如读取用户输入直到合法为止;而for在遍历固定长度集合时优势明显。
看一个等价的while写法,可以看到计数器声明、判断、自增分散在三处,维护时容易漏改某一项:
int j = 0;
while (j < 5)
{
Console.WriteLine("当前数字:" + j);
j++;
}
当团队代码评审时,for循环能让人一眼看清循环边界和步长,降低出错概率。如果步长不是1,比如每次加2,for循环只需改迭代段为i += 2,结构依然紧凑。
用for遍历数组与倒序输出
计数循环最常见的用途是按下标访问数组或列表。利用数组的Length属性,可自动适配元素个数,不必硬编码上限。
string[] fruits = { "苹果", "香蕉", "橘子" };
for (int k = 0; k < fruits.Length; k++)
{
Console.WriteLine("第" + k + "个水果:" + fruits[k]);
}
有时需要从后往前处理数据,例如撤销栈操作。只需把初始化改成从末位开始,条件改为不小于0,迭代改为递减:
for (int m = fruits.Length - 1; m >= 0; m--)
{
Console.WriteLine("倒序:" + fruits[m]);
}
这种写法避免了使用反转方法带来的额外内存分配,在性能敏感场景中更直接。要注意的是,数组下标从0起算,所以末位是Length - 1,写成Length会触发索引越界异常。
常见错误与规避办法
第一类错误是修改循环变量类型或作用域,比如在循环外试图使用i,编译器会报找不到符号。第二类是在循环体内重新赋值计数器,打乱了迭代节奏,引发逻辑混乱。
建议把循环变量命名为有含义的短词,并在复杂逻辑中提取为方法,减少单层循环里的分支。若需跳过某次迭代可用continue,结束整个循环用break,它们和for配合能覆盖绝大多数计数遍历需求。
for (int n = 0; n < 10; n++)
{
if (n % 2 == 0)
{
continue; // 跳过偶数
}
Console.WriteLine("奇数:" + n);
}
理解这三段式的生命周期,配合断点调试观察变量变化,入门者很快就能把for循环用得稳妥。后续学习foreach时,也会发现它其实是迭代器封装,底层仍离不开类似的计数或移动指针机制。