控制台输入输出是控制台程序最基本的操作,学习完这一段内容以后,就该进入C#语句(statement)的学习了。
其实,在涉及向对象之前,一段C#代码是很难和一段同样功能的C代码相区分的。C#的语句和C的语句几乎完成同样的功能,那就是实现选择(判断)和循环结构。这也是结构化程序设计中的最基本结构。
而对于VB来说,语法上就更没什么进步了,因为VB6的各种控制结构已经非常完善甚至有点娇惯我们的程序员了。现在只不过去掉了一些历史遗留的关键字,时的语法更清晰了。
选择结构有两种,二重选择和多重选择。
C#的二重选择是:
VB的二重选择是:
这个比较容易懂,两种语言都是在条件为真的时候执行语句块1,否则执行语句块2。看不懂者请补习数据类型与变量那一章。
对于逐级条件过滤,两种语言都提供了一种更为简洁的语法来代替嵌套:
C#的是
而VB的是
读者如果能自行写出这种语法所对应的嵌套形式的二重选择结构,那么就说明你对二重选限的认识已经很标准了。
当然,这种逐级过滤是一种最一般的情况,因为条件1到条件n之间并不要求有内在联系,而多重分支语句则是为了处理逐级过滤的一种特殊情况:表达式的多可能值匹配,来设计的。
C#的是
在这种语法之下,运行时会首先计算表达式的值,然后从上至下逐个核对case后面的值是否与当前计算出来的表达式的值相等,如果相等,则执行该case语句之后的对应的语句块,如果不等,则和对下一个,直到遇到第一个(注意,是第一个,也就是说,如果有两个case后面的值相等,永远是第一个case被执行到)匹配的值为止,或直到扫描完所有匹配项为止。如果没有匹配项,则执行default块。每个case块的末尾一般都需要一个break语句,表示跳出switch语句块,如果没有break,那么紧随其后的下一个case块会被执行,这个事情在C时代就是这样。
对于VB,则复杂一些:
VB的Select Case语句的用途和C#的switch一样,Case Else块相当于C#的default块。不过有几个区别,第一个区别就是VB的每个Case块不需要break语句,每个Case执行完会自动跳到End Select后面继续执行。第二个,也就是最重要的确别,在于VB的Case块后面的可能值是可以罗列多个的,而C#只能有1个,并且,如果你觉得罗列多个值不足以表达你的意思,比如你需要表达式的值落在某个区间,还可以用Is关键字来表示表达式的值。比如,你想表达这么一个意思:如果a的值等于1或者2或者大于10,那么就给a增加1,如果a的值是5、6或小于0,那么就给a减小1,如果以上情况都不是,则给a为0。这个意思用C#的switch写是这样(简直让人头疼):
而如果是VB则是:
C#代码是不是让你的脑子有点乱?所以用C#来实现这样的逻辑,还是用if表达起来更清晰,虽然显得有点没技术含量。
有兴趣的同学不妨来考虑这么一个问题,case块的数量会影响执行的速度吗?比如,表达式有10个可能值和10000个可能值相比,匹配一次的平均时间会有区别么?一般人从直觉上都会觉得有。那么,请同学们自己编写程序来证明自己的想法。我的实验结果一周后公布。
其实,在涉及向对象之前,一段C#代码是很难和一段同样功能的C代码相区分的。C#的语句和C的语句几乎完成同样的功能,那就是实现选择(判断)和循环结构。这也是结构化程序设计中的最基本结构。
而对于VB来说,语法上就更没什么进步了,因为VB6的各种控制结构已经非常完善甚至有点娇惯我们的程序员了。现在只不过去掉了一些历史遗留的关键字,时的语法更清晰了。
选择结构有两种,二重选择和多重选择。
C#的二重选择是:
if
( 条件 )
{
语句块1
}
else
{
语句块2
}
{
语句块1
}
else
{
语句块2
}
VB的二重选择是:
If
条件
Then
语句块1
Else
语句块2
End If
语句块1
Else
语句块2
End If
这个比较容易懂,两种语言都是在条件为真的时候执行语句块1,否则执行语句块2。看不懂者请补习数据类型与变量那一章。
对于逐级条件过滤,两种语言都提供了一种更为简洁的语法来代替嵌套:
C#的是
if
( 条件1 )
{
语句块1
}
else if ( 条件2 )
{
语句块2
}
.
else
{
语句块x
}
{
语句块1
}
else if ( 条件2 )
{
语句块2
}
.
else
{
语句块x
}
而VB的是
If
条件1
Then
语句块1
ElseIf 条件2 Then
语句块2
.
.
.
ElseIf 条件n Then
语句块n
Else
语句块x
End If
语句块1
ElseIf 条件2 Then
语句块2
.
.
.
ElseIf 条件n Then
语句块n
Else
语句块x
End If
读者如果能自行写出这种语法所对应的嵌套形式的二重选择结构,那么就说明你对二重选限的认识已经很标准了。
当然,这种逐级过滤是一种最一般的情况,因为条件1到条件n之间并不要求有内在联系,而多重分支语句则是为了处理逐级过滤的一种特殊情况:表达式的多可能值匹配,来设计的。
C#的是
switch
( 表达式 )
{
case 可能值1:
语句块1
[break;]
case 可能值2:
语句块2
[break;]
.
.
.
case 可能值n:
语句块n
[break;]
default:
语句块x
[break;]
}
{
case 可能值1:
语句块1
[break;]
case 可能值2:
语句块2
[break;]
.
.
.
case 可能值n:
语句块n
[break;]
default:
语句块x
[break;]
}
在这种语法之下,运行时会首先计算表达式的值,然后从上至下逐个核对case后面的值是否与当前计算出来的表达式的值相等,如果相等,则执行该case语句之后的对应的语句块,如果不等,则和对下一个,直到遇到第一个(注意,是第一个,也就是说,如果有两个case后面的值相等,永远是第一个case被执行到)匹配的值为止,或直到扫描完所有匹配项为止。如果没有匹配项,则执行default块。每个case块的末尾一般都需要一个break语句,表示跳出switch语句块,如果没有break,那么紧随其后的下一个case块会被执行,这个事情在C时代就是这样。
对于VB,则复杂一些:
Select
Case
表达式
Case 可能值1
语句块1
.
.
.
Case Else
语句块x
End Select
Case 可能值1
语句块1
.
.
.
Case Else
语句块x
End Select
VB的Select Case语句的用途和C#的switch一样,Case Else块相当于C#的default块。不过有几个区别,第一个区别就是VB的每个Case块不需要break语句,每个Case执行完会自动跳到End Select后面继续执行。第二个,也就是最重要的确别,在于VB的Case块后面的可能值是可以罗列多个的,而C#只能有1个,并且,如果你觉得罗列多个值不足以表达你的意思,比如你需要表达式的值落在某个区间,还可以用Is关键字来表示表达式的值。比如,你想表达这么一个意思:如果a的值等于1或者2或者大于10,那么就给a增加1,如果a的值是5、6或小于0,那么就给a减小1,如果以上情况都不是,则给a为0。这个意思用C#的switch写是这样(简直让人头疼):
switch
( a )
{
case 1:
case 2:
a++
break;
case 5:
case 6
a--
break;
default:
if ( a > 10 )
{ a++;break;}
if ( a < 0 )
{ a--;break;}
a = 0;
}
{
case 1:
case 2:
a++
break;
case 5:
case 6
a--
break;
default:
if ( a > 10 )
{ a++;break;}
if ( a < 0 )
{ a--;break;}
a = 0;
}
而如果是VB则是:
Select
Case
a
Case 1 , 2 , Is > 10
a += 1
Case 5 , 6 , Is < 0
a -= 1
Case Else
a = 0
End Select
Case 1 , 2 , Is > 10
a += 1
Case 5 , 6 , Is < 0
a -= 1
Case Else
a = 0
End Select
C#代码是不是让你的脑子有点乱?所以用C#来实现这样的逻辑,还是用if表达起来更清晰,虽然显得有点没技术含量。
有兴趣的同学不妨来考虑这么一个问题,case块的数量会影响执行的速度吗?比如,表达式有10个可能值和10000个可能值相比,匹配一次的平均时间会有区别么?一般人从直觉上都会觉得有。那么,请同学们自己编写程序来证明自己的想法。我的实验结果一周后公布。