在代码流程控制中,循环的含义就是在特定的条件下多次执行一些代码,以简化某些重复工作的执行,一个典型的例子就是累加的计算,如计算整数1到100的和就可以使用如下代码。

static void Main(string[] args)
{
    int sum = 0;
    for( int i=1;i<=100;i++)
    {
        sum = sum + i;
    }
    Console.WriteLine("1到100的和是{0}", sum);
}

代码执行结果如下图。

enter image description here

从这个示例中,我们可以看到循环语句结构的几个要素,如本例中是通过变量i来控制循环变量的;其中,i的初始值是1;执行循环语句的条件是当i小于或等于100;每次循环语句执行后通过i++语句使变量i的数据加1,只有这样才可以结束循环,如果没有结束循环的条件,则会无限循环,也称为死循环。

下面,看一下for语句结构的基本语法。

for(<循环变量初始化> ; <循环条件> ; <循环变量每次变化>)
{
    <语句块>
}

for语句结构的含义是,循环控制变量初始化为一定的值,当其满足一定的条件时就执行<语句块>的内容,每次执行后需要一个改变循环变量数据的操作。

在C#中,循环相关的还包括foreach语句结构、while语句结构、do-while语句结构、continue语句和break语句,下面分别讨论。

foreach语句结构可以方便的访问集合(数组、列表等类型,后续会讨论相关内容)中的成员,如下面的代码,我们分别使用for语句结构和foreach语句结构访问一个数组的成员。

static void Main(string[] args)
{
    int[] arr = new int[10];
    // 给数组成员赋值
    for( int i=0;i<10;i++)
    {
        arr[i] = i + 1;
    }
    // 显示数组成员数据
    foreach(int num in arr)
    {
        Console.WriteLine(num);
    }
}

代码执行结果如下图所示。

enter image description here

再来看一下while和do...while语句结构,其中,while语句结构的应用格式如下。

while(<条件表达式>)
{
    <语句块>
}

下面是do...while语句结构的应用格式。

do
{
    <语句块>
}while(<条件表达式>);

我们可以看到,while和do...while语句结构最大的区别就在于<条件表达式>的位置不同;其执行逻辑是,在while语句结构中,每次循环前会对条件进行判断,如果条件满足,即<条件表达式>的值为true时,执行本次循环,当条件不满足时,即<条件表达式>的值为false时,结构循环结构的执行;而do...while语句结构中,条件的判断会在每次循环执行后进行,也就是说,循环中的<语句块>最少会执行一次,当<条件表达式>的值为true时执行下一次循环,为false时结构循环结构的执行。

下面的代码是使用while语句结构计算1到100的累加运算。

static void Main(string[] args)
{
    int sum = 0, n = 1;
    while (n <= 100)
    {
        sum += n;
        n++;
    }
    Console.WriteLine("1到100累加结果为{0}", sum);
}

下面的代码是使用do...while语句结构计算1到100的累加运算。

static void Main(string[] args)
{
        int sum = 0, n = 1;
        do
        {
            sum += n;
            n++;
        } while (n <= 100);
        Console.WriteLine("1到100累加结果为{0}", sum);
}

大家可以观察while和do...while语句结构的工作方式和特点,这里需要注意的是,do...while语句结构会在每次循环结束时才对条件进行判断,如果第一次执行循环时数据不满足要求,就有可能产生错误。

接下来的工作,我们来计算1到100中偶数的和,可以使用两种方式,首先是通过for语句结构中的循环控制变量每次循环后加2来处理,如下面的代码。

static void Main(string[] args)
{
        int sum = 0;
        for(int i=2;i<=100;i+=2)
        {
            sum += i;
        }
        Console.WriteLine("1到100中偶数的和是{0}", sum);
}

另一种方法是在循环语句中使用continue语句来实现,如下面的代码。

static void Main(string[] args)
{
    int sum = 0;
    for(int i=2;i<=100;i++)
    {
        if (i % 2 == 1) continue;
        sum += i;
    }
    Console.WriteLine("1到100中偶数的和是{0}", sum);
}

本代码中,当i除以2的余数是1,也就是i不是偶数时,就使用continue语句结束本次循环,当i是偶数时,就累加到sum变量中。这里使用的continue语句的功能就是结束本次循环,当条件满足时执行下次循环,当条件不满足时就结束循环结构。

另一个相关的语句是break,其功能是终止循环结构的执行;如下面的代码,用来一个整数是否为质数。

static void Main(string[] args)
{
        int x=17; // 大于1的整数
        int max = (int)Math.Sqrt(x);
        bool isPrime = true;
        for(int i=2;i<=max;i++)
        {
            if(x % i ==0 )
            {
                isPrime = false;
                break;
            }
        }
        Console.WriteLine("{0}{1}质数", x,
            isPrime?"是":"不是");
}

本例中,首先将isPrime变量设置为true,即假装x是质数;当x小于4时循环不会执行,2和3就是质数;当x大于或等于4并且能被2到x的算术平方根中的任何数整除时,x就不是质数,此时,将isPrime设置为false,并使用break语句退出循环结构。

此外,如果是多层循环,可以通过goto语句加标签的方法快速跳出,如下面的代码。

static void Main(string[] args)
{
        int counter = 0;
        for (int i = 0; i <= 100; i++)
        {
            for (int j = 0; j <= 100; j++)
            {
                for (int k = 0; k <= 100; k++)
                {
                    counter++;
                    if (i == 10 && j == 20 && k == 30)
                        goto I_FOR_END;

                }
            }
        }
    I_FOR_END:;
        Console.WriteLine("内层循环执行{0}次", counter);
}

代码中,我们定义了一个标签I_FOR_END用于标签i循环结束的位置,在三层循环中,当满足特定的条件时就使用goto I_FOR_END;语句直接跳转到三层循环外面。

实际开发中,循环语句结构是灵活多变的,大家可以根据实际需要选择合理的代码结构。

如果大家对i++表达式的应用不太熟悉,可以参考我的另一篇文章《这些东西还在争吗》

CHY软件小屋原创作品!