3.2 迭代语句的应用
迭代语句又称为循环语句,使用迭代语句可以让程序多次执行相同的代码或代码块,这些代码或代码块称为循环体。对于任何一个循环体来说,都应该提供一个跳出循环的条件,不同的循环语句提供不同的条件。在C#中,常用的迭代语句有for语句、while语句、do…while语句和foreach语句。下面就详细介绍这几种迭代语句的用法。
3.2.1 for循环语句
for循环可以执行指定的次数,并维护自己的计数器。其语法格式如下:
for(表达式1;表达式2;表达式3) { 代码块 }
其中,表达式1由一个局部变量声明或由一个逗号分隔的多个表达式组成。其变量的作用域范围为从声明开始,直到代码块的结尾。
表达式2规定必须是一个布尔表达式。
表达式3必须包含一个用逗号分隔的表达式列表。
for循环语句的执行过程如图3-5所示。
图3-5 for循环语句的执行过程
从图3-5中不难看出for循环的执行顺序如下。
(1)如果存在表达式1,则先执行表达式1。
(2)如果存在表达式2,则计算表达式2;如果不存在表达式2,则程序转移到代码块执行,若执行到了代码块的结束点,则按顺序计算表达式3,然后从上一步骤中表达式2的计算开始,执行下一次的循环。
下面通过一个具体例子来详细讲解下for循环。
例3-1:使用for循环输出0~9(ConsoleForLoop)
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ConsoleForLoop { class Program { static void Main(string[] args) { for (int i = 0; i < 10; i++) { Console.WriteLine(i); } Console.ReadLine(); } } }
运行结果如图3-6所示。
图3-6 使用for循环输出0~9
在此例中,先初始化i为0,然后判断i的值是否小于10,若小于则输出i的值并换行,接着i自增1,然后开始下一次判断i的值是否小于10,若小于则输出i的值并换行,接着i自增1,重复以上步骤,直到i的值为10时,再判断i的值是否小于10,此时循环条件不成立,循环结束。
3.2.2 while循环语句
while语句执行一个语句或语句块,直到指定的表达式计算为false。
while循环的语法格式如下:
while (条件表达式) { 代码块 }
while循环语句的执行过程如图3-7所示。
图3-7 while循环语句的执行过程
下面通过一个具体例子来详细讲解下while循环。
例3-2:使用while循环输出0~9(ConsoleWhileLoop)
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ConsoleWhileLoop { class Program { static void Main(string[] args) { int i = 0; while (i < 10) { Console.WriteLine(i); i++; } Console.ReadLine(); } } }
运行结果如图3-8所示。
图3-8 使用while循环输出0~9
在此例中,先初始化i为0,然后判断while的条件表达式i<10是否成立,若成立则输出i的值并换行,接着i自增1,然后开始下一次的判断,判断while的条件表达式i<10是否成立,直到i<10不成立,循环终止。
3.2.3 do…while循环语句
do…while语句与while类似,do…while语句是先执行循环体内的语句,再判断循环条件表达式是否成立,所以至少会执行一次循环体内的语句。
do…while循环的语法格式如下:
do { 代码块 } while (条件表达式);
do…while循环语句的执行过程如图3-9所示。
图3-9 do…while循环语句的执行过程
下面通过一个具体例子来详细讲解下do…while循环。
例3-3:使用do…while循环输出0~9(ConsoleDoWhileLoop)
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ConsoleDoWhileLoop { class Program { static void Main(string[] args) { int i = 0; do { Console.WriteLine(i++); } while (i < 10); Console.ReadLine(); } } }
运行结果如图3-10所示。
图3-10 使用do…while循环输出0~9
在此例中,先初始化i为0,然后执行循环体内的语句输出i的值并换行,接着i自增1,之后判断条件表达式i<10是否成立,若成立则继续下一次循环输出i的值并换行,接着i自增1,然后开始下一次的判断,判断条件表达式i<10是否成立,直到i<10不成立,循环终止。
3.2.4 foreach循环语句
foreach循环语句用于枚举一个集合的元素,并对该集合中的每个元素执行一次循环体中的语句。
foreach循环语句的语法格式如下:
foreach(类型 循环变量名 in 集合或数组) { 代码块 }
其中,类型和循环变量名用于声明循环变量,循环变量在整个代码块内有效。在循环过程中,循环变量表示当前正在执行循环的集合元素或数组元素。
foreach循环语句的执行过程如图3-11所示。
图3-11 foreach循环语句的执行过程
下面通过一个具体例子来详细讲解下foreach循环语句。
例3-4:使用foreach循环语句输出数组中的元素(ConsoleForEachLoop)
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ConsoleForEachLoop { class Program { static void Main(string[] args) { string[] strs = new string[] { "I", "am", "a", "programmer,", "I", "speak", "for", "himself." }; foreach (string s in strs) { Console.Write(s + " "); } Console.ReadLine(); } } }
运行结果如图3-12所示。
图3-12 使用foreach循环语句输出数组中的元素
3.2.5 for、foreach、while和do…while的区别
(1)for循环语句一般用在对于循环次数已知的情况下,而while语句和do…while语句则一般用在对于循环次数不确定的情况下。for循环必须使用整型变量作为循环的计数器,通过条件表达式限定计数器变量值来控制循环。
(2)用while语句和do…while语句时,对循环变量的初始化操作应该放在while语句和do…while语句之前,而for语句则可以在初始化语句中完成。
(3)while语句和do…while语句实现的功能相同,唯一的区别就是do…while语句先执行后判断,无论表达式的值是否为true,都将执行一次循环;而while语句则是首先判断表达式的值是否为true,如果为true则执行循环语句;否则将不执行循环语句。
(4)while语句和do…while语句,只在while后面指定循环条件,但是需要在循环体中包括使循环趋于结束的语句,而for语句则可以在迭代语句中包含使循环趋于结束的语句。
(5)foreach语句只能对数据进行读操作,在其作用域内不能对进行遍历的值做修改,其遍历顺序只能递增。自动遍历给定集合的所有值。
3.2.6 双重循环
所谓双重循环就是循环中再嵌套循环进去。下面通过一个小例子简单介绍下双重循环的应用。
例3-5:使用双重for循环语句输出如下样式的图案(ConsoleDoubleForLoop)
*
***
*****
*******
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ConsoleDoubleForLoop { class Program { static void Main(string[] args) { for (int i = 1; i <= 4; i++) { for (int j = 1; j <= (i * 2) - 1; j++) { Console.Write('*'); } Console.WriteLine(); } Console.ReadLine(); } } }
运行结果如图3-13所示。
图3-13 使用双重for循环语句输出指定样式的图案