c#学习第16课,迭代(循环)语句 跳转语句
迭代(循环)语句
迭代语句的功能是在某个条件的控制下,让一对逻辑反复执行,反复执行的逻辑叫做循环体
迭代语句有四种:
while语句
2.do语句
3.for语句
4.foreach语句
while语句
当while关键字括号后面的布尔类型表达式值为true时,反复执行循环体
while语句的循环体可能执行一次或多次也可能一次也不执行
while(boolean-expression) embedde-statement
//这是while语句的语法
while关键字后面的圆括号输入bool类型表达式(循环条件),如果结果为true那么循环体就可以得到执行,如果是false那么循环体就得不到执行。
用while语句做一个小游戏,输入两个数字,如果它们的和是100就加1分,如果和不是100的话游戏结束并显示最终得分
class Program
{
static void Main(string[] arge)
{
var scroll = 0;
bool con = true;
while(con)
{
Console.WriteLine("请输入数字1");
var str1 = Console.ReadLine();
Console.WriteLine("请输入数字2");
var str2 = Console.ReadLine();
int x = int.parse(str1);
int y = int.parse(str2);
int z = x + y;
if(z == 100)
{
Console.WriteLine("正确,{0} + {1} = {2}",x,y,z);
scroll++;
}
else
{
Console.WriteLine("错误,{0} + {1} = {2}",x,y,z);
con = false;
}
}
Console.WriteLine("游戏结束,你的得分是{0}",scroll);
}
}
do…while语句
至少执行一次或多次循环体
do语句先执行一次循环体然后依while表达式的值来决定是否再次循环
do embedde-statement while(boolean-expression)
//do语句语法
使用do语句实现刚才的小游戏
class Program
{
static void Main(string[] arge)
{
var scroll = 0;
do
{
Console.WriteLine("请输入数字1");
var str1 = Console.ReadLine();
Console.WriteLine("请输入数字2");
var str2 = Console.ReadLine();
int x = int.parse(str1);
int y = int.parse(str2);
int z = x + y;
if(z == 100)
{
Console.WriteLine("正确,{0} + {1} = {2}",x,y,z);
scroll++;
}
else
{
Console.WriteLine("错误,{0} + {1} = {2}",x,y,z);
}
}while(z==100);
Console.WriteLine("游戏结束,你的得分是{0}",scroll);
}
}
注意
无论使用while语句和do语句都能实现上述的小游戏,我们需要用哪个更好呢?
while可能一次也不执行循环体而do语句至少执行一次循环体,我们的小游戏肯定需要先玩也就是先执行循环体。(具体选择使用什么语句,只需要看需求的语境就可以得知使用什么语句)
for语句
for语句一般用于计算数字循环,for语句由for关键字,循环变量,循环条件(布尔类型表达式),循环变量的变化组成
for语句执行逻辑:
1. 编译器检测声明的变量
2. 循环条件计算后的值是true还是false
3. 为true则执行循环体,为false结束for语句
4. 最后执行所设置循环变量的变化
for ( for-initializer(opt ) ; for-condition(opt) ; for-iterator(opt) ) embedded-statement
//for语句语法
使用for语句打印10行"坚持就是胜利"
for(int i=0;i<10;i++)
{
Console.WriteLine("坚持就是胜利");
}
foreach语句
foreach语句通常用来集合遍历循环,枚举一个集合中的元素。也就是访问集合里的每个元素并且可以给每个访问的元素添加嵌入语句
并不是所有集合都可以被遍历,一个类冒号(:)后面跟的就是这个类的基类和基接口,这些单词以大写i开头的就是基接口。
只要类有IEnumerable基接口,就可以集合遍历
IEnumerable有一个方法叫GetEnumerator——获得当前集合的迭代器(c#所有能被遍历的集合都有自己的迭代器)
IEnumerator有一个object类型的Current属性,一个返回布尔类型的MoveNext方法和一个没有返回类型的Reset方法。
movenext如果还能继续访问元素就得到true反之为false
current获得当前访问的元素
reset将在集合中访问的迭代器拨回到最开始的位置
指月
你问我什么是月亮,我拿手指着月亮。我的意思是我指着的是月亮不是我的手指是月亮,天上有十个月亮我一个一个的指给你看。(手指就是迭代器,月亮就是集合中的元素,我一个一个指给你看)
foreaxh语句是集合遍历循环的"简记法"
如果不用foreach语句来进行集合遍历循环是这样的:
List<int> intlist = new List<int>{1,2,3,4,5,6,7};
IEnumetor enumetor = intlist.GetEnumerator;
while(enumetor.MoveNext)
{
Console.WriteLine(enumetor.Current);
}
foreach语句语法
foreach(lacal-variable-type identifier in expression) embedded-statement
foreach关键字然后括号声明一个变量(这个变量就相当于迭代器),in关键字后面跟着一个表达式(表达式求出的值就是访问的集合),括号外输入一个嵌入式语句
使用foreach语句进行集合遍历循环:
List<int> intlist = new List<int>{1,2,3,4,5,6,7};
foreach(var enumetor in intlist)
{
Console.Writeline(Current);
}
两相比较之下使用foreach进行集合遍历循环会更简便
跳转语句
break语句
结束当前循环语句
以上述游戏为例子,当玩家玩腻了想要退出时可以用break退出游戏
class Program
{
static void Main(string[] arge)
{
var scroll = 0;
do
{
Console.WriteLine("请输入数字1");
var str1 = Console.ReadLine();
Console.WriteLine("请输入数字2");
var str2 = Console.ReadLine();
if(str1 == "end" && str2 == "end")
{
break;
}
int x = int.parse(str1);
int y = int.parse(str2);
int z = x + y;
if(z == 100)
{
Console.WriteLine("正确,{0} + {1} = {2}",x,y,z);
scroll++;
}
else
{
Console.WriteLine("错误,{0} + {1} = {2}",x,y,z);
}
}while(z==100);
Console.WriteLine("游戏结束,你的得分是{0}",scroll);
}
}
continue语句
放弃当前循环语句,立刻开始一次新的循环
放在上面的游戏例子中在玩家输入的不是数字字符使parse方法出现异常,屏幕会告诉玩家格式错误并重新开始游戏
class Program
{
static void Main(string[] arge)
{
var scroll = 0;
do
{
Console.WriteLine("请输入数字1");
var str1 = Console.ReadLine();
Console.WriteLine("请输入数字2");
var str2 = Console.ReadLine();
try
{
int x = int.parse(str1);
int y = int.parse(str2);
catch(FormatException)
{
Console.WriteLine("输入的只能是数字字符哦");
continue;
}
}
int z = x + y;
if(z == 100)
{
Console.WriteLine("正确,{0} + {1} = {2}",x,y,z);
scroll++;
}
else
{
Console.WriteLine("错误,{0} + {1} = {2}",x,y,z);
}
}while(z==100);
Console.WriteLine("游戏结束,你的得分是{0}",scroll);
}
}
注意
无论是break还是continue在迭代语句中都只对包裹它们的那层循环起作用
goto语句
非主流语句,简单介绍:和名字一样"去到"或"跳转到"
跳出循环语句去到goto标识的语句
return语句
return语句只能在函数体里面使用,用于返回函数的结果,return之后就不会再执行return后面的语句了,结束了函数调用
return语句有一个原则——“尽早return”,下面举一个’‘尽早return’‘的例子和一个没有’‘尽早return’'的例子
//没有尽早return
class Program
{
static void Main(string[] args)
{
static void GetName(string name)
{
if(!IsNullOrEmpty(name))
{
Console.WriteLine("Hello i is {0}",name);
Console.WriteLine("You good? I is {0}",name);
}
return;//对于void而言写不写return都无所谓
}
}
}
//尽早return
class Program
{
static void Main(string[] args)
{
static void GetName(string name)
{
if(IsNullOrEmpty(name))
{
return;
}
Console.WriteLine("Hello i is {0}",name);
Console.WriteLine("You good? I is {0}",name);
}
}
}
尽早return写出来的方法能让人更容易知道参数是什么值的时候是异常的。而且还能避免写出来的方法头重脚轻——如果方法的逻辑不是只有一行而是100行,100行之后才写return那么查找return的时候就显得很繁琐
这节课讲了
1.迭代(循环)语句
2.跳转语句
还有一些语句
using语句
yield语句
checked和unchecked语句
lock(用于多线程)语句
标签语句
空语句
其中using语句yield语句和lock语句在后续讲解
checked和unchecked语句以及标签语句和空语句不太常用不进行详细讲解
