5.3 循环语句

一般情况下,语句是顺序执行的,函数中的第一条语句先执行,接着是第二条语句,以此类推。在C#中提供了允许重复执行同一代码块的循环语句,有while语句、do…while语句、for语句和foreach语句。

5.3.1 while循环语句

只要给定的条件为真,C#中的while循环语句会重复执行一条目标语句。

while循环语句的语法格式如下:

while循环是先判断表达式的值,然后再执行语句或语句块,直到表达式的值为false。如果循环刚开始表达式的值就为false,那么语句或语句块就不会被执行。

例5-8】编写程序,使用while语句,循环输出一组数据。

(1)在Visual Studio 2017中,新建名称为“Project8”的文件。

(2)在代码编辑区域输入以下代码。

【程序分析】本例演示了while语句的使用。在代码中,首先定义一个int类型的变量x,并赋值为3;然后通过while语句进行判断,如果变量x小于13,则依次循环输出x的值。当条件被测试且结果为false时,就会跳过循环主体,直接执行紧接着while循环的下一条语句。本例的流程如图5-13所示。

在Visual Studio 2017中的运行结果如图5-14所示。

图5-13 while语句的流程图

图5-14 while语句

使用while语句时要注意以下几点。

(1)while语句中的表达式一般是关系表达式或逻辑表达式,只要表达式的值为真(非0)即可继续循环。

(2)循环体包含一条以上语句时,应用“{}”括起来,以复合语句的形式出现;否则,它只认为while后面的第1条语句是循环体。

(3)循环前,必须给循环控制变量赋初值,如上例中的(int x=3;)。

(4)循环体中,必须有改变循环控制变量值的语句,如上例中的(x++;),否则循环永远不结束,形成所谓的死循环。

5.3.2 do…while循环语句

do…while循环与while循环类似,但是do…while循环会确保至少执行一次循环。其语法格式如下:

do…while循环是先执行语句或语句块,然后再判断表达式的值,如果表达式的值为true,则继续执行循环,直到表达式的值为false。

注意:do…while循环刚执行的时候不管表达式的值为true或者是false它都要先执行一次语句或语句块,然后再来判断表达式的值。也就是说,如果一开始表达式的值为false,它也会执行一次循环。另外,while语句后面必须使用分号(;)。

例5-9】编写程序,使用do…while语句,循环输出一组数据。

(1)在Visual Studio 2017中,新建名称为“Project9”的文件。

(2)在代码编辑区域输入以下代码。

【程序分析】本例演示了do…while语句的使用。在代码中,首先定义一个整型变量x,并赋值为6;然后执行循环体,并对变量x进行判断,查看是否小于16。如果条件为真,控制流会跳转回上面的do,然后重新执行循环体。这个过程会不断重复,直到给定条件变为假为止。本例的流程如图5-15所示。

在Visual Studio 2017中的运行结果如图5-16所示。

图5-15 do…while流程图

图5-16 do…while语句

使用do…while语句应注意以下几点。

(1)do…while语句是先执行“循环体语句”,后判断循环终止条件,与while语句不同。二者的区别在于:当while后面的表达式开始的值为0(假)时,while语句的循环体一次也不执行,而do…while语句的循环体至少要执行一次。

(2)在书写格式上,循环体部分要用“{}”括起来,即使只有一条语句也如此;do…while语句最后以分号结束。

(3)通常情况下,do…while语句是从后面控制表达式退出循环。但它也可以构成无限循环,此时要利用break语句或return语句直接从循环体内跳出循环。

5.3.3 for循环语句

一个for循环是一个允许用户编写执行特定次数的循环控制结构。在C#中,for循环的语法如下:

初始化表达式:可以在该位置定义一个变量并为其赋一个初始值,也可以使用for循环前面定义的变量,但是使用for循环前面定义的变量必须在该位置为其重新赋一个初始值。

注意:在该位置定义一个变量并为其赋一个起始值,这种用法定义的变量的作用域仅在for循环语句中,也就是说,for循环语句后面的代码不能使用该变量;但是用for循环前面定义的变量这种用法定义的变量,在for循环语句后面的代码也能被使用。

条件表达式:如果条件表达式为真,则执行循环主体;如果为假,则不执行循环主体,且控制流会跳转到紧接着for循环的下一条语句。

迭代表达式:执行完语句或语句块后就执行迭代表达式,然后再执行条件表达式判断循环是否继续。

例5-10】编写程序,使用for循环输出一组数据。

(1)在Visual Studio 2017中,新建名称为“Project10”的文件。

(2)在代码编辑区域输入以下代码。

【程序分析】本例演示了for语句的使用。在for循环的括号中,表达式“int x=10;”用于初始化变量x;表达式“x<20;”用于设置循环次数,不能超过20次;在执行完for循环主体后,控制流会跳转到语句“x++;”,该语句用于更新变量x。该语句可以留空,只要在条件后有一个分号出现即可。本例的流程如图5-17所示。

在Visual Studio 2017中的运行结果如图5-18所示。

图5-17 for语句流程图

图5-18 for语句

for循环语句中的3个表达式都是可以省略的,但“;”不能省略。

(1)省略<初始化表达式>,此时应在for语句之前给该变量赋初值。

例如:

(2)省略<条件表达式>,表示不判断循环条件,循环无终止地进行下去,也可以认为<条件表达式>始终为真。

例如:

该语句将无休止地执行循环体,一直输出变量x的值,成为死循环。为了终止循环,就要在循环体中加入break语句和return语句等。

(3)省略<迭代表达式>,此时应在循环体内部实现循环变量的增量,以保证循环能够正常结束。

例如:

相当于把<迭代表达式>写在了循环体内部,作为循环体的一部分。

(4)省略<初始化表达式>和<条件表达式>,此时只给出了循环条件。

例如:

相当于把<初始化表达式>放在了循环的外面,<条件表达式>作为循环体的一部分。这种情况与前面介绍的while语句完全相同。

例如:

(5)3个表达式都省略,既不设初值,也不判断条件,循环变量不增值,无终止地执行循环体。

例如:

注意:表达式可以省略,但中间的两个分号不能省略。

5.3.4 foreach循环语句

foreach循环用于列举出集合中所有的元素,foreach语句中的表达式由关键字in隔开的两个项组成。in右边的项是集合名,in左边的项是变量名,用来存放该集合中的每个元素。

foreach循环语句的语法格式如下:

foreach语句括号中的类型和标识符用来声明该语句的循环变量,标识符即循环变量的名称。循环变量相当于一个只读的局部变量。在每一次循环时,都会从集合中取出一个新的元素值,放到只读变量中去,如果括号中的整个表达式返回值为true,foreach块中的语句就能够执行。一旦集合中的元素都已经被访问到,整个表达式的值为false,控制流程就转入到foreach块后面的执行语句。

注意:循环变量的类型必须与集合的类型相同。集合内元素的个数决定循环内程序段重复执行的次数。

例5-11】编写程序,通过foreach循环找出字符数组中0和1的个数并输出。

(1)在Visual Studio 2017中,新建名称为“Project11”的文件。

(2)在代码编辑区域输入以下代码。

【程序分析】本例演示了foreach语句的使用。在代码中,首先初始化了两个变量x和y,分别用来表示0和1的个数;之后声明一个字符类型的数组,用foreach循环判断字符格式,如果遍历到0,则将x的值加1,否则就将b的值加1;最后输出x和y的值。

在Visual Studio 2017中的运行结果如图5-19所示。

图5-19 foreach语句