您的位置:首页 > 编程语言 > C#

【C#】基础知识—流程控制语句

2016-03-02 20:39 429 查看
一、流程控制语句的描述

语句是程序完成一次完整操作的基本单位,默认情况下,程序的语句是顺序执行的。但是,如果一个程序只有顺序执行的语句,那么程序可能什么也做不了。在c#中有很多语句,通过这些语句可以控制程序代码的执行次序,提高程序的灵活性,从而实现比较复杂的程序。

1. 条件选择语句

条件选择语句用于根据某个表达式的值从若干条给定语句中选择一个来执行,包括if语和switch语句两种:

 1> if语句的基本格式如下:

if(布尔表达式)
语句 1;


执行过程:首先判断条件的结果,如果结果为true,则执行语句;如果条件为false,则跳出语句1. 执行后面的语句

注意:1)if后面括号中的条件,要能计算成一个bool类型的值;

2)默认情况下,if语句只能带1句话。即和if语句有关系的语句只有语句1

案例:

int a = 3;
if (a > 1)
Console.WriteLine("成立");   // if默认只带这一句话
Console.WriteLine("程序结束");   // 此句话和if语句没有关系
// 输出成立 程序结束
Console.WriteLine();
if (a > 11)
Console.WriteLine("成立");   // if默认只带这一句话
Console.WriteLine("程序结束");   // 此句话和if语句没有关系
// 输出程序结束
Console.ReadKey();

 2> if.....else语句格式如下

if(条件)
{语句块1;}
else
{语句块2;}
当条件多的时候,有时候不建议使用if......else多层嵌套,使用if并列比较好。
 3> 使用Switch-case语句实现多分支语句

switch(表达式)
{
case 值1; 语句块1;
break;

case 值2; 语句块2;
break;

default;
}


执行过程:首先计算表达式,然后根据计算结果与匹配case后面的值,如果有匹配项,则执行匹配项后面的语句,知道break语句跳出switch-case。如果所有的case的值都不匹配,那么有default则执行default后面的语句,知道break结束。如果没有default,则跳出switch-case,什么都不执行。(注意是搜索匹配项,与default的位置没有关系)

案例:

bool flag = false;
Console.WriteLine("请输入数字");
string inputNum = Console.ReadLine();
int num = Convert.ToInt32(inputNum);
switch (num)
{
case 1:
Console.WriteLine("结果是1");
break;
default:
Console.WriteLine("结果是无");
flag = true;
break;
case 2:
Console.WriteLine("结果是2");
break;
case 3:
Console.WriteLine("结果是3");
break;
case 4:
Console.WriteLine("结果是4");
break;

}
// 说明1 这个是判断
if (flag == false)
{
Console.WriteLine("永远成立");
}
// 说明2 这个是赋值
if (flag = false)  // 赋值完成后,其实就是flag的值变成了false,永远不成立
{
Console.WriteLine("永远不成立");
}
Console.ReadKey();


注意:

 1)if与switch的比较(switch:一般只能用于等值比较,  if else ...if :可以处理范围)

结合的案例:

// 月份的天数
Console.WriteLine("请输入年份");
string syear = Console.ReadLine();
int year = Convert.ToInt32(syear);
Console.WriteLine("请输入月份");
string smonth = Console.ReadLine();
int month = Convert.ToInt32(smonth);
switch (month)
{
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
Console.WriteLine("31天");
break;
case 2:
if (year % 400 == 0 || year % 4 == 0 && year % 100 != 0)
{
// 闰年的判断
Console.WriteLine("是闰年");
Console.WriteLine("29天");
}
else
{
// 是平年
Console.WriteLine("是平年");
Console.WriteLine("28天");
}
break;
default:
Console.WriteLine("30天");
break;
}
Console.ReadKey();


2. 循环语句的使用 

在c#中,常见的循环语句有while语句、do....while语句、for语句、foreach语句

 1> while循环的语法

while(【布尔表达式】)  // 循环的条件判断  布尔表达式也就是条件语句
{
循环体;(要执行程序的N个循环体)
}


注意:在循环体中,一定要有那么一句话,改变循环条件中的某个变量的值,使循环条件终有那么一天喂false;

特点:先判断,在执行

 2> do...while 语法

do
{
循环体;
}while(条件);  // 注意结尾有一个分好

注意:这个的特点是不管条件成立与否都会执行一次程序。执行顺序:首先是执行循环体,然后判断条件是否成立,要是成立就会继续执行,如果不成立就会跳出。

 3> for循环语法

for(表达式1; 表达式2;表达式3)
{
循环体;
}
注意:一般情况下
 1)表达式1:用于定义循环变量和对循环变量赋初值;

 2)表达式2:循环条件

 3)表达式3:用于改变循环变量的值

执行过程:

 1)计算表达式1,转向第二步; 2)计算表达式2(循环条件),如果表达式2的值为true转向第三步; 3)执行循环体,转向第四步;  4)执行表达式3,转向第二步

循环语句例子1:

int age = 0;
int sum = 0;

for (int i = 0; i < 5; i++)
{
Console.WriteLine("请输入第{0}个人的年龄?", i + 1);
try
{
age = Convert.ToInt32(Console.ReadLine());
if (age < 0 || age > 100)
{
Console.WriteLine("年龄不合法");
break;
}
sum = sum + age;
}
catch
{
Console.WriteLine("你输入的年龄不是数字,错误!程序终止");
break;
}
}
Console.WriteLine("你输入的五个人的年龄平均值是: {0}", sum / 5);
Console.ReadKey();

 4>foreach语句

foreach语句用于枚举一个集合的元素,并对该集合中的每个元素执行一次嵌入语句,但foreach语句用于更改集合内容,一避免产生不可预知的错误。

格式:

foreach(【类型】 【迭代变量名】in 【集合类型表达式】)
{
【语句块】;
}
其中【类型】和【迭代变量名】用于声明迭代变量,迭代变量相当于一个范围覆盖整个语句块的局部变量,在foreach语句执行期间,迭代变量表示当前正在为其执行迭代的集合元素;【集合类型表达式】必须有一个从改集合元素类型到迭代变量的类型的显示转换,如果【集合类型表达式】的值为null,则会出现异常。
案例:http://blog.csdn.net/haojie2014/article/details/45439249(java中的foreach语句)

public static void test6()
{
int [] arr = {7, 10, 1};

foreach (int x in arr)
{
// foreach 语句,int x是引用的变量,arr指定要循环遍历数组,最后将x输出
// 意思就是将arr中的每一个元素赋值给变量x
// 类似于c#中的foreach(数据类型  迭代变量名  in  集合类型表达式)
// 类似于OC中的for(数据类型 变量名 in 集合类型表达式)
Console.WriteLine(x);
}
}

延伸:var

var是3.5新出的一个定义变量的类型(称为推断类型),其实也就是弱化类型 的定义,var可代替任何类型;编译器会根据上下文来判断你到底是想用什么类型的

至于什么情况下用到var:当自己不能确定自己将用什么类型的时候就这样做(类似object,不过效率会高点)

使用var定义变量的时候会有以下的特点:

 1)必须在定义的时候初始化。也就是必须是var s = "abcd"形式,而不能是var s; s = "abcd";

 2)一旦初始化完成,就不能再给变量赋与初始化值类型不同的值了;

 3)var要求是局部变量;

 4)使用var定义变量和object不同,它在效率上和使用强类型方式定义变量完全一样;

案例:

3. 跳转语句

 1> break语句

break语句只能运用在switch、while、do.....while、for或foreach语句中,break包含在这几中语句中,否则会出现编译错误。当多条switch、while、do.....while、for或foreach语句互相嵌套时,break语句只能运用在最里层的语句。如果要穿越多个嵌套层,则必须使用goto语句。(goto用于跳出深层嵌套)
案例:

public static void test7()
{
for (int i = 0; i < 4; i++)
{
Console.WriteLine("\n第{0}次循环: ", i);
for (int j = 0; j <= 10; j++)
{
if (j == 2)
break;  // break只是跳出了内层循环,不过程序还是会执行4次
Console.WriteLine(j + " ");
}
}
Console.WriteLine();
}




 2> continue语句

continue语句只能运用在while、do.....while、for或foreach语句中,用来忽略循环语句块内位于它后面的代码而直接开始下一次新的循环。当多个while、do.....while、for或foreachbreak语句互相嵌套时,continue语句只能使直接包含它的循环语句开始一次新的循环。

案例:

public static void test7()
{
for (int i = 0; i < 4; i++)
{
Console.WriteLine("\n第{0}次循环: ", i);
for (int j = 0; j <= 10; j++)
{
if (j%2 == 0)
continue;
Console.WriteLine(j + " ");  // 1 3 5 7 9 输出四次
}
}
Console.WriteLine();
}




 3> goto语句

goto语句用于将控制转移到由标签标记的语句。goto语句可以被应用在switch语句中的case标签和default标签,以及标记语句所声明的标签。goto语句的形式:

goto 【标签】
goto case 【参数表达式】
goto default

goto 【标签】的目标是具有给定标签的标记语句;

goto case的目标是它所在的switch语句中的某个语句列表,次列表包含一个具有给定常数值的case标签;

goto  default语句的目标是它所在的那个switch语句中的default标签。

案例:

public static void test8()
{
string input = Console.ReadLine();
string[] mystr = new string[3];
mystr[0] = "一表人才";
mystr[1] = "两全其美";
mystr[2] = "三心二意";
for (int i = 0; i < mystr.Length; i++)
{
if (mystr[i].Equals(input))
{
goto Found;
}
}
Console.WriteLine("你查找的语句{0}不存在 ", input);
goto Finish;
Found:
Console.WriteLine("你查找的语句{0}存在 ", input);
Finish:
Console.WriteLine("查找完毕");

Console.WriteLine();
}

 4> return语句

return用于退出类的方法,是控制返回方法的调用者,如果方法有返回类型,return语句必须返回这个类型的值;如果方法没有返回类型,应使用没有表达式的return语句。

案例:

public static string ReadAnswer()
{
string result = "";
do
{
result = Console.ReadLine();
if (result != "y" && result != "n")
{
Console.WriteLine("输入有误,请重新输入");
}
} while (result != "y" && result != "n");

return result;
}


4. 综合应用
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息