跟siki老师学C#第三天(下)

来源:互联网 发布:ubuntu安装cuda8.0 编辑:程序博客网 时间:2024/04/27 06:13

虽然是周末,学习还是不能停,美好的一天不能做几道练习题就糊弄过去了,接着往下学习。

今天学习C#语句。
说到C#语句,我们就要先说流程控制。
什么是流程控制呢?流程控制就是我写出来的代码由我来决定它到底怎么运行,按什么顺序或条件。
那么,为什么要使用流程控制呢?
在前两天中我们写下的代码都是非常简单的代码,只要编译器从上往下逐行执行,就能得到我们想要的结果,但实际上,我们要实现一个功能,远比这要复杂。
比如说:我写下了某段代码,但是我不想让这段代码上来就被执行,而是满足某个条件时才被执行,这就是一个分支流程控制方式。
再比如说:我写下了某段代码,但是我想让这段代码反复执行,我又不想一遍一遍地去写或者复制代码,那我就选择循环流程控制。

至此,流程控制可基本分为两类:选择流程和循环流程,也就是大家所熟悉的选择和循环。
分支:有条件的执行代码;
循环:重复执行相同的代码。
这样一来,大家应该清楚所谓的流程控制是指什么吧?

先说分支,分支作为有条件的执行代码,首先它要保证自己是有条件的,是有门槛的,不是想执行就能执行的。
我们来看一个例子:我们在大学里面查成绩,可能往往比较关注的不是多少分,而是有没有及格,那么及格和不及格到底是怎么来判定的呢?
那就是60分(大多数情况下)。

Console.WriteLine("请输入该学生的成绩:");int score=Convert.ToInt32(Console.ReadLine());if (score >= 60){    Console.WriteLine("该学生成绩及格!");}else {    Console.WriteLine("该学生成绩不及格!");}Console.ReadKey();

这里面的if就是一个分支,else也是一个分支,if后面括号里的内容就是执行if这个花括号里面代码的条件,else也是一样,else后面的条件与if后面的条件相异又互补(一般情况下),else后面的条件也都是省略的(因为if里面的条件知道了,else与它相反,也很容易得到)。
这里写图片描述

这里写图片描述

这就是流程控制中的分支语句。

下面介绍循环语句:循环语句意思就是循环重复执行一段代码:

for (int i = 0; i < 3;i++ ){    Console.WriteLine("Paul是超人!");    Console.WriteLine("而且是个好人!");}Console.ReadKey();

我们发现结果它把这两句话打印了三遍:
这里写图片描述
在for花括号里面的代码都会被执行三遍,这就是循环控制语句。

但是,无论是if还是for,只有当它后面圆括号里面的条件值为True时,它下面的花括号里面的代码才会被执行,因此,圆括号里面的值都是bool类型的。

所以我们要介绍bool运算符(也叫比较运算符),这些运算符一般就用在流程控制中作为条件。
运算符有==、 >、 <、 >=、 <=、 !=等:

//当a等于b时,执行if(a==b){    //balabala}//当a不等于b时执行if(a!=b){    //balabala}//当a大于b时执行if(a>b){    //balabala}//当a小于b时执行if(a<b){    //balabala}//当a大于等于b时执行if(a>=b){    //balabala}//当a小于等于b时执行if(a<=b){    //balabala}

还有四种布尔运算符:!、&、|、^
!的意思是取反:

bool var=!var1;   //前提是var1也是bool类型的,否则会报错的

&的意思是并且:

bool var=var1&var2;//当var1和var2都为true时,var才为true,只要有一个为falsevar就为false

|的意思是或:

bool var= var1|var2;//只要var1和var2中有一个值为truevar就为true,当两个值都为false时,var才为false

^的意思是异或:

bool var = var1^var2;//当var1和var2中有且只有一个为truevar才为true,两个都是false或两个都是true时,var的值为false

除了这四个外,还有两个运算符:&&和||,它们分别对应&和|,作用相同,都是判断并且和或者的逻辑运算符,但是有区别:

&&连接多个条件时,当第一个或者前面的条件不满足时,这个条件以后的条件都不再判断了,直接跳出判断了,而&不同,它把所有的条件都判断一遍后才告诉我们这些条件的最终值是true还是false。
同理,当||连接多个条件时,当第一个条件的值为True时,根本不需要再去判断后续的条件是否为真了,因为最终结果一定是True。
大家可以看到,实际上&&和||的使用比&和|在系统的性能上要好,尤其是用到大量的bool运算符的时候效果更好。
在这里我想到了另一个问题:

int b;int a;if(b/a>2&&a!=0){    Console.WriteLine(b/a);    Console.ReadKey();}

看看上面这个例子,这种写法实际上是不严谨的,万一a等于0呢?
代码是从前往后执行的,会先判断b/a是否大于2,然后再判断a是否等于零,那万一a恰巧等于零呢?这里b/0就已经是个错误了,这是运算错误,0不能被除,是一个安全隐患,所以这两个条件的顺序要换一下才更完美。

那么有了&&和||,我们更多推荐使用&&和||而不是&和|,那么&和|是不是就一无是处,没有什么作用呢?
其实不是的,按照网上查找到的信息来看,!、&、|、^这四种运算符是对数值(当然都是bool类型的值)进行操作,它们操作的是存储在变量里的一系列位,而不是变量的值,什么意思?什么叫位?我暂时也搞不懂,它们也就称为按位运算符不过很少用到,一般用到的都是!、&&、||这三个运算符,^都很少用得到。

今天学习了C#的一些语句,讲到了流程控制,下面这个语句也是进行流程控制的,那就是goto语句。
goto语句是干什么的呢?那当然是进行流程控制的了。
其实这是一种现在已经很少用到的一种形式了:给代码定义标签,通过标签跳转到某一行代码上:

int a = 20;a++;Console.WriteLine(a);

这是一个简单的不能再简单了的语句了:
这里写图片描述

现在用上goto语句:

int a = 20;goto myTager;a++;myTager:Console.WriteLine(a);

结果就不一样咯:
这里写图片描述
大家比较可以看出:是a++;这一句被跳过了。其实goto语句就是跳转到指定标签,上面例子中,myTager就是标签,标签的定义方法就是在目标代码的前面加上一个标签名:就可以了,goto跳转的时候直接goto加上标签名就好了。(标签定义好后也可以把目标代码放在下一行):

int a = 20;goto myTager;a++;myTager:Console.WriteLine(a);

因为goto语句打乱了程序自上而下执行的顺序,因此代码比较难阅读,因此并不推荐使用goto语句,只要了解有这种用法就可以了。

后面siki老师又说到了if语句,但是我们在上面已经介绍了if语句甚至是for循环语句,所以就不再多说了。
我们在之前说了一个三元运算符?:。
其实这个三元运算符就是一个if(){}else{}语句的简写:

int a = (b>c?b:c);

上面这段代码和下面的代码相同:

int a;if(b>c){    a=b;}else{    a=c;}

对于if语句,可以有多个else:

if(){}else if(){}else if(){}else if(){}

而且这这个过程之中,我又发现了一个有趣的现象:

if (Convert.ToBoolean(Console.ReadLine())){    Console.WriteLine("您输入的是正确的!");}else {    Console.WriteLine("您输入的是错误的!");}Console.ReadKey();

上面这个程序块中,我从控制台输入true或True,它会输出“您输入的是正确的!”
从控制台输入false或False,它会输出”您输入的是错误的!“。
我在想:难道用Convert类中的方法转换字符串不区分大小写?
试验下:

string a = Console.ReadLine();string b = Convert.ToString(a);Console.WriteLine(a);Console.WriteLine(b);Console.ReadKey();

这里写图片描述
看来ToString()方法不会修改大小写,接下来试试ToBoolean()方法:

string a = Console.ReadLine();bool b = Convert.ToBoolean(a);Console.WriteLine(a);Console.WriteLine(b);Console.ReadKey();

看看运行结果:
这里写图片描述

这里写图片描述
(看来只有某些特定值才可以)
这下我们又了解到:从控制台输入一个不管大写还是小写的true或false,将他们转换成bool类型后都变成了True或False(前提是拼写没有错误)。

那我们说:是不是计算机内部存的bool类型的值都是True或False?
哈哈,当然不是,计算机内部存的都是二进制代码呀!
其实但从上面这个例子是不能看出这个结论的,因为TRUE->True或者true->True都是使用了Convert类之后的结果,所以平时的bool值不一定是True或False形式的,即使是这样,True也有可能等于true啊。
我们来验证一下True和true是否相等:

string a = Console.ReadLine();bool b = Convert.ToBoolean(a);Console.WriteLine(a);Console.WriteLine(b);if (b = true) {    Console.WriteLine("相等!");}Console.ReadKey();

上面这段代码,显而易见,当我输入true时,a=true,b=True,如果True和true相等,那么就会紧接着在下面输出”相等“
这里写图片描述
这样显示相等,但是当我们把条件改为b=false试着验证False与false是否相等时,结果却出人意料:
这里写图片描述
所以我们现在只能认为编译器同等看待True和true、False和false,以后如果弄通了再回来补上吧。

好了,今天就记录到这里了。

来总结一下:
今天学习了语句,首先是流程控制,什么是流程控制、为什么要使用流程控制、流程控制有哪两个基本分类、bool运算符有哪几种、他们的作用是什么、&&和&,||和|有什么区别、什么是goto语句、goto语句怎样使用。

0 0
原创粉丝点击