撰写了文章 更新于 2020-01-08 12:23:05
从C#开始的编程入门——分支与循环
人生和galgame一样,充满了选择。
程序也是一样。
顺带一提我还是喜欢英梨梨一点。
如果。。。否则。。。
我们希望在不同的情况下,执行不同的代码。毕竟你也不想在周末被闹钟吵醒。
“我特么上班”
if语句用于控制程序在满足某个条件下执行某一段代码,否则执行else中的代码。如果今天是周末,那么就继续睡,否则还得特么上班。
首先以if关键字开头,后面的括号中是条件,条件必须是布尔类型的表达式。某些语言的,例如C++中的if条件可以不必是布尔类型表达式。但是C#必须是布尔类型表达式。条件后面是一对大括号,大括号中可以包含多行语句。通常,由大括号和其中的语句组成的结构,我们称为代码块(block)。
if的代码块结束后,可以加上一个else代码块,当不满足条件就会执行else代码块中的代码。如果没有else代码就会直接跳出回到原来的代码块。注意大括号后面是没有分号的。
如果代码块中的代码只有一行,可以省略大括号。但是不建议。
只要大括号相互匹配,格式就不那么重要,你可以把起始括号写在本行,也可以写在下一行。
嵌套
无内鬼,可以套娃。
if语句中还可以嵌套更多的if。
注意,在else中如果还想嵌套if,可以直接把if写在后面,其实就是把if看作一个单独的语句,然后省略了括号而已。
注意,如果m为0.1,程序最终会正常输出0<m<1。说明程序最终正常掉进了那个else里面。if可以单独出现,但else则不能单独出现。else会尝试匹配离它最近的if,如果无法正确匹配一个if,最终会在编译时发生错误。因此,无论你的代码块里有几行语句,使用括号总是没有错的,还能帮你避免匹配错误。
作用域
如果你在一个if里面声明了一个变量,那么当你进入又一个if的时候我们还能访问它吗?如果在上面的代码中添加两个新变量:
哪些变量的使用是合法的,哪些又会发生错误?
实际上,被包围的代码块可以访问包围它的代码块中的变量,但是反过来是不行的。就像一栋楼,你有一个房间,你可以去大楼的公共厕所,别人也可以去,你可以去你的房间,但其他人却不能随意进入你的房间,同理你也不能去别人房间。
当我们引入一个大括号包裹的代码块,就相当于引入了一个新的作用域(scope),作用域可以理解为名称的有效范围,函数、自定义类型都有作用域,并且可以进行更精确的访问权限控制,我们在讲到类的时候再详细说明。
重复
重复同一件事情,在编程中称为循环(loop)。
直到——while
while循环会一直循环到条件为false时。
break
当需要提前结束循环时,使用break语句直接跳出循环。
这时当x为50时就会结束了
循环n次——for
for循环的条件有三个部分,看起来很复杂,但实际上很直接。
首先第一个语句声明一个变量用于记录循环到哪里了,然后每次循环结束根据第二个语句中的表达式判断这个变量是否满足循环继续到条件,在每次循环结束时使用第三个语句修改控制变量以便进行下一次循环。
比如像这样求出1-100的和。
同样可以使用break跳出循环。
for与while
一般来说,在我们不知道循环次数时,我们会选择while。比如可以while(true)进行死循环,在循环内部根据外部状况判断结束循环时机。
而for循环,一般我们在条件里面就限制了控制变量的范围,因此我们在知道循环次数的范围时更倾向于选择for循环。
但是,这确实不是绝对的。很多时候while和for循环其实是可以相互转换的。
for的条件的三个语句并非必须的,当三个表达式完全省略时,它就变成了while。
这是一个死循环
而如果while搭配一个外部变量进行循环控制,那么它实际上也就是一个for循环。
但是值得注意的是,for的条件中声明的控制变量在循环结束之后就不能再使用了,也就是说它离开了它的作用域。
switch
不是玩游戏那个switch,也不是交换机。
如果需要把星期一到七转换成对应的英语并输出,应该怎么办?
运用之前所学现在已经完全可以办到。
我们可以使用七个if挨个判断。
后面的省略了
你一共需要7个if,感觉还行。
但实际上还有适合用在这种问题上的语法结构。
switch就是用来解决这种问题,它会针对一个表达式的取值的不同情况作出不同的反应。
星期二之后的依然省略了
小括号中是表达式,随后引入一个代码块。
case关键字表示一个case(?),就是其中的一种取值情况。
随后是一个冒号。冒号后可以包含多行语句,语句比较多的时候可以使用代码块整理。
当一个case需要执行的语句结束时,使用break跳出switch。如果不写break,会提示错误,说程序会掉到(fall through)下一个case的语句中。
switch语句本身是沿袭C/C++中的switch,但是在C/C++中,switch是允许fall-through的,对于需要使多种情况执行同样的语句时,这种特性或许是有用的,但是有时候可能会由于误操作导致fall through。C#不允许fall-through但是可以在一个case没有语句的情况下fall through。
这时无论day是1还是2,都会执行2后面的语句,就相当于同时接受两种情况。
default顾名思义,如果表达式取值找不到匹配的case,最终就会执行default里面的语句。
事实上整个switch的设计都是备受争议的。因为确实switch在很多时候可以被if替代,某些语言直接没有了switch语句,比如Python。而有些语言选择使用模式匹配语法来应对这种情况。实际上像C#和Swift等语言,对这种从C/C++沿袭对语法结构做了很多扩展,C#中的switch表达式也能够提供比起switch更强大的模式匹配功能,switch的其他用法我们在后续文章中补充。
在本篇中,我们学习了编程语言中最常见的分支语法结构,它们让我们的程序可以在不同情况下作出不同的响应。而循环让我们可以重复执行类似的代码。
下一篇文章里,我们做一个简单的小游戏,让我们把前面所学的所有东西综合运用起来。
目录