表达式的顺序控制是把操作数和操作符看做基本单位,研究操作符的计算顺序。而语句间的顺序控制是把程序语句作为基本单位,研究语句执行的顺序。程序语言对语句的执行都遵循一条隐含规则,这就是在没有其他顺序控制结构规定的情况下,按照语句在程序中的物理位置执行程序,也就是顺序执行。改变这种语句执行次序的方法是使用程序顺序控制结构,这些控制结构有跳转结构、选择结构和循环结构。
1.跳转结构
跳转结构就是令过程控制无条件地从当前语句转向给定的语句执行的控制结构,跳转语句的执行非常有效,它反映了计算机本身硬件的转移指令,如x86指令中的jmp指令。通常的跳转语句都有如下形式:goto
虽然goto语句的使用十分简单和高效,但是大量地使用会令过程控制逻辑混乱,程序变得难以理解和维护。人们已经证明可以使用顺序结构、选择结构和循环结构组成任何程序,而抛弃掉“有害的”goto语句。目前比较一致的观点是程序员必须谨慎地使用goto语句,使用时必须考虑是否可以用更好的结构代替。
2.选择结构
选择结构是对给定条件进行判断,然后根据结果执行不同的语句或语句块的结构。最典型的选择结构的形式如下:
If
Else
Endif
这意味着如果expr条件为真,则执行statements1语句块,否则执行statements2语句块。在某些复杂的情况下,需要对多个条件进行判断,则if-then-else语句会进一步复杂,演化为if-then-elseif-then-else等。
在两个分支的选择结构基础上,多数语言也会提供多分支的选择结构,它在许多情况下可以改善程序的可读性。典型的多分支选择结构如下:
Switch (
Case of result1:
Case of result2:
…
Default:
Endswitch
虽然Case控制结构的功能可以由if-then-else结构模拟,但是case控制结构能提供更清晰的计算过程的反映。
C/C++的情况比较特别,在Case结构中使用break语句表示跳出结构的控制。如果在其中一个Case中没有使用break语句,则控制会顺序执行至下一个Case中的语句。这个特点在为程序员带来方便的同时,也为程序员带来了麻烦。程序员疏忽漏掉的break语句会导致程序有意想不到的执行结果。因此在C#中,语言不再允许这种Case的“贯穿”,而强制程序员使用goto语句跳转至相应的Case标号,以保证程序员清楚地知道过程控制的行为。
3.循环结构
循环结构是根据条件重复执行指定语句的控制结构。循环结构是由循环头和循环体组成的。循环头就是循环的条件,用以控制循环的次数,循环体则是提供动作的语句。典型的循环头结构有以下几种。
1)计数器循环
这种结构需要说明一个循环计数器,并且在头部中说明计数器的初值、终值和增量。典型的计数器循环的结构是Pascal的计数器循环:
For I:=0 to 30 step 2 Do
该循环的头部说明了计数器为I,其初值为0.终值为30.增量为2.循环的执行次数为16次。
2)条件循环
条件循环是指在给出的条件表达式成立时重复执行循环体的循环结构,它的头部中说明了该条件表达式。这种循环期望在循环体执行的时候会改变条件测试表达式中的某个变量的值,否则循环将不终止。典型的条件循环的结构有两种,一种是:
While
另一种是:
Repeat
前者是先测试条件,然后执行循环体,循环体执行0次或以上。而后者是先执行循环体,再测试条件,循环体执行一次或以上。
3)基于数据的循环
基于数据的循环的循环次数是由数据格式决定的。例如C#中的foreach结构:
foreach (object o in
对于每一次循环,变量o都会取得数据集中的下一个值,数据集元素的个数决定了循环的次数。
4)不定循环
如果循环结束条件过于复杂,不容易在头部表示,通常会使用在循环头部没有显示终止测试的无限循环,然后在循环体中通过条件判断退出循环。C/C++中有两种典型的不定循环结构:一是for (;;)