C# Learning:选择语句
if 语句(if-else)
if语句根据bool值来识别运行哪个语句。if语句基本形式如下:
A
if(M)
B
else
C
D
其中M是一个bool表达式(比如bool类型的变量,比如调用具有bool类型返回值的方法,常见的有“a > 1”)。程序是这样执行的:
- 执行A;
- 如果M的值为true,执行B;否则,执行C;
- 执行D。
其中else部分不是必要的:
A
if(M)
B
C
程序这样执行:
- 执行A;
- 如果M的值为true,执行B;
- 执行C。
为了避免在else中大量嵌套if,我们可以使用“else if”:
if(M)
A
else if(N)
B
else if(O)
C
else if(P)
D
...
else
E
此时会依次从M、N、O、P、……判断下来,如果判断到true,则执行对应的代码,并且立即跳出整个if语句;如果全是false,则执行E。也就是说,在A、B、C、D、……、E中只可能有一段代码被执行了。
同样,else部分也是可选的,此时如果全都是false则没有任何一段会被执行。
switch语句(switch-case)
在此我们介绍的是C#6及之前的switch语句(C#7.0之后的switch比较复杂,放这里不太合适),基本语法如:
switch (A)
{
case C1:
S1
case C2:
S2
case C3:
S3
...
default:
D
}
其中C1、C2、C3、……必须是常数,且值互不相等;A和C1、C2、C3、……必须是字符型、字符串、bool、整数值(例如 int 或 long)或者枚举值。
由于C1、C2、C3、……必须值互不相等,因此A最多与其中之一相等,那么就从它对应的标签“case C1”、“case C2”、“case C3”开始执行……而若与其中任何一个都不相等,将转到default。
与else类似,default也是可选的,如果与任何一个都不相等,又无default,switch中的语句一个都不会执行。
switch中的“case C1”等等属于标签,因此并不是说S1结束之后就会停止,按道理来说会继续执行S2,直到全部都执行过。在C++中的确是允许如此的。为了解决这样的问题,可以使用比如return、goto等跳转语句进行跳转,这个可以参考我的另一篇文章《C# Learning:跳转语句》。但是这两个跳转方式还是比较麻烦,于是break语句的一个用法就产生了。
switch (A)
{
case C1:
S1
break;
case C2:
S2
break;
case C3:
S3
break;
...
default:
D
break;
}
这里的break就表示离开整个switch语句,就不会出现继续往后执行的情况。
要注意,不添加跳转语句的做法在C中是允许的,但在C#中为了确保不出现忘记写break等问题,这样的做法不被允许,它会被视为编译时错误。如果需要在某个case结束后执行另一个case,可以使用goto语句。