C#基础之流程控制语句详解
C#程序的执⾏都是⼀⾏接⼀⾏、⾃上⽽下地进⾏,不遗漏任何代码。为了让程序能按照开发者所设计的流程进⾏执⾏,必然需要进⾏条件判断、循环和跳转等过程,这就需要实现流程控制。C#中的流程控制包含了条件语句、循环语句、跳转语句和异常处理四个⽅⾯。
⼀、跳转语句
break语句:终⽌并跳出循环体。
continue语句:终⽌当前循环,重新开始⼀个新的循环。
goto语句:跳转到指定位置。
C#允许给代码⾏加上标签,这样就可以使⽤goto语句直接跳转到这些代码⾏上。goto语句的⽤法如下:
goto<labelName>;
标签⽤下述⽅式定义:
<labelName>:
goto语句有两个限制,不能跳转到像for循环这样的代码块中,也不能跳出类的范围,不能退出try…catch语句后⾯的finally块。
这⾥讲解goto语句只为了解其语法,当遇到时能知道代码的意思,本⼈不建议使⽤。
return语句:跳出循环及其包含的函数。
throw语句:抛出⼀个异常。
⼆、条件语句
条件语句可以根据条件是否满⾜或者根据表达式的值控制代码的执⾏分⽀。C#有两种控制控制代码分⽀的结构,分别是if语句和switch语句。
if语句
注意:if语句的条件可以是布尔变量,也可以是表达式,但如果是表达式,则表达式得到的结果必须是布尔值。
1、单选择if语句,即条件成⽴执⾏,语法如下:
if(条件)
{
do;
}
2、ifelse语句,即条件成⽴执⾏A否则执⾏B,语法如下:
if(条件)
{
do A;
}
else
{
do B;
}
延伸:三元运算符?:也相当于⼀个ifelse语句,语法如下:<;表达式> ? <resultIfTrue> : <resultIfFalse> 其中计算表达式可得到⼀个布尔值,运算符的结果根据这个值来确定是<resultIfTrue>,还是<resultIfFalse>。例:
int a = 8;
string b = (a < 10) ? "⼩于10" : "⼤于10";
3、多选择if语句,即对多个条件进⾏判断,成⽴的执⾏,语法如下:
if(条件1)
{
do A;
}
else if(条件2)
{
do B;
}
else if(条件3)
{
do C;
}
else
{
do D;
}
其中else if语句的个数不受限制,但是如果else if语句的个数较多,则应该考虑另⼀种分⽀结构:switch语句。
注意:多选择if语句⾃上⽽下,只要有⼀个条件成⽴就不会去判断其它任何条件。
switch语句
switch…case语句适合于从⼀组互斥的分⽀中选择⼀个执⾏分⽀。其形式是switch参数的后⾯跟⼀组case⼦句。如果switch参数中表达式的值等于某个case⼦句旁边的某个值,就执⾏该case⼦句中的代码。此时不需要使⽤花括号把语句组合到块中,只需使⽤break语句标记每段case代码的结尾即可。也可以在switch语句中包含⼀条default⼦句,如果表达式不等于任何case⼦句的值,就执⾏default⼦句的代码。其语法如下:
switch(表达式)
{
case 1:
Console.WriteLine("1");
break;
case 2:
Console.WriteLine("2");
break;
case 3:
Console.WriteLine("3");
break;
default:
Console.WriteLine("4");
break;
}
注意:switch语句每个case语句后⾯的值必须与表达式所得到的值的类型相同,⽽且必须是常量,不能是变量;switch语句中所有case语句后⾯的值必须是互斥的,也就是说case后⾯的值不能存在两个相同的值,因为所有case语句后⾯的值必须是互斥的,所以case语句的排放顺序⽆关紧要,甚⾄可以把default语句放在最前⾯!但是为养成良好的编程习惯和代码有清晰的逻辑,我不建议这样写;switch语句中default语句只能存在⼀个,不能存在多个;通常情况下,每个case后⾯都必须有⼀个break语句,break语句作⽤是中断switch语句的执⾏,但C#中也可以使⽤其它中断语句来中断switch语句的执,如return语句、goto语句。使⽤break语句和return语句来中断是有区别的,break语句仅仅中断switch语句的执⾏,如果switch语句后⾯还有其它代码是可以继续执⾏的,但是return语句中断则会中断switch语句所在的⽅法,也就是说switch语句后⾯的代码将不会执⾏,switch语句所在的⽅法将直接返回。使⽤goto语句可以从⼀个case跳到另⼀个case中执⾏,如下⾯这段代码:
int a = 1;
switch (a)
{
case1:
Console.WriteLine("1");
goto case2;
case2:
Console.WriteLine("2");
break;
case3:
Console.WriteLine("3");
break;
default:
Console.WriteLine("4");
break;
}
程序说明:程序执⾏完 case 1后会直接执⾏case 2。但是我们不建议这样做,这会导致很难察觉的逻辑错误。
通常情况下switch语句中⼀个case语句处理完成后,不能⾃由的进⼊下⼀个case语句,但是这个规则有⼀个例外。如果把多个case语句放在⼀起,其后⾯加⼀个代码块,实际上是⼀次检查多个条件,如果满⾜这些条件中的任何⼀个,就会执⾏代码,例如:
int a = 2;
switch (a)
{
case1:
case2:
case3:
Console.WriteLine("1或者2或者3");
break;
default:
Console.WriteLine("4");
break;
}
三、循环语句
循环就是重复执⾏语句,循环结构可以实现⼀个程序模块的重复执⾏,它对我们简化程序、更好的组织算法有着重要的意义。
1、do循环
do循环的结构如下:
do
{
语句或语句块;
}while (表达式);
do循环先执⾏语句或语句块,然后再判断表达式的值,如果表达式的值为true,则继续执⾏循环,直到表达式的值为false。注意:do循环刚执⾏的时候不管表达式的值为true或者是false它都要先执⾏⼀次语句或语句块,然后再来判断表达式的值。也就是说如果⼀开始表达式的值为false,它也会执⾏⼀次循环。do循环⽆论布尔表达式的值是true还是false,语句或语句块⾄少会执⾏⼀次。另外while语句后⾯必须使⽤分号(;)。
2、while循环
while循环的结构如下:
while(表达式)
{
语句或语句块;
}
while循环则是先判断表达式的值,然后再执⾏语句或语句块,直到表达式的值为false。如果循环刚开始表达式的值就为false,那么语句或语句块就不会被执⾏。
3、for循环
for循环的结构如下:
for(<;初始化表达式>;<;条件表达式>;<;迭代表达式>)
{
语句或语句块;
}
初始化表达式:可以在该位置定义⼀个变量并为其赋⼀个起始值,也可以使⽤for循环前⾯定义的变量,但是使⽤for循环前⾯定义的变量必须在该位置为其重新赋⼀个起始值。注意:在该位置定义⼀个变量并为其赋⼀个起始值,这种⽤法定义的变量的作⽤域仅在for循环语句中,也就是说for循环语句后
⾯的代码就不能使⽤该变量;但是⽤for循环前⾯定义的变量这种⽤法定义的变量for循环语句后⾯的代码就也能使⽤该变量。
条件表达式:它是循环继续或者终⽌的条件。
迭代表达式:执⾏完语句或语句块后就执⾏迭代表达式,然后再执⾏条件表达式判断循环是否继续。
for循环⽰例:
//将1到10打印到屏幕上
for (int a =1 ; a <= 10; a++)
{
Console.WriteLine(a);
}
Console.ReadKey();
4、foreach循环
foreach语句⽤于枚举⼀个集合的元素,并对该集合中的每⼀个元素执⾏⼀次嵌⼊语句。foreach循环的结构如下:
foreach(<;类型> <;迭代变量名> in <;集合>)
{
语句或语句块;
}
注意:迭代变量的类型必须与集合的类型相同。集合内元素的个数决定循环内程序段重复执⾏的次数,每次进⼊循环,会依次将集合元素内容指定给变量,当所有元素都读完后,就会跳出foreach循环。foreach循环对集合内元素进⾏只读访问,不能改变任何元素的值。foreach循环在循环的过程中不能对集合进⾏添加元素或者删除元素的操作。⽰例:
List<string> strList = new List<string>();
for (int a =1 ; a <= 10; a++)
{
strList.Add(a.ToString());
}
foreach (string str in strList)
{
Console.WriteLine(str);
strList.Remove(str);
}
Console.ReadKey();
以上程序中的foreach语句在输出集合strList中的第⼀元素并将其移除集合后进⾏下⼀次循环的时候会产⽣异常。
5、⽆限循环
在代码编写错误或者故意进⾏设计时,可以定义永不终⽌的循环,即所谓的⽆限循环。⽰例:
while(true)
{
语句或语句块;
}
⽆限循环语句也是有⽤的,⽽且可以使⽤break语句或者⼿⼯使⽤Windows任务管理器退出⽆限循环。
四、异常处理
C#中的异常处理也算⼀种流程控制,try…catch…finally语句⽤于异常的捕获和处理,具体语法如下:
try
{
语句或语句块;
}
catch(<execptionType> e)
{
语句或语句块;
}
finally
{
语句或语句块;
}
try:包含抛出异常的代码。
catch:包含抛出异常时要执⾏的代码。catch块可以使⽤<execptionType>设置为只响应特定的异常类型,以便提供多个catch块。finally:包含始终会执⾏的代码,如果没有产⽣异常,则在try块之后执⾏,如果处理了异常,就在catch块后执⾏。try…catch…finally语句的执⾏顺序依次是:
continue语句执行过程
1、try块在发⽣异常的地⽅中断程序的执⾏。
2、如果有catch块,就检查该块是否匹配已抛出的异常类型。如果没有catch块,就执⾏finally块(如果没有catch块,就⼀定要有finally 块)。
3、如果有catch块,但它与已发⽣的异常类型不匹配,就检查是否有其他catch块。
4、如果有catch块匹配已发⽣的异常类型,就执⾏它包含的代码,再执⾏finally块(如果有)。
5、如果catch块都不匹配已发⽣的异常类型,就执⾏finally块(如果有)。
从try…catch…finally语句的执⾏顺序可以看出try…catch…finally语句有多种组合模式,这⾥就不详细讲解。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论