11月 25, 2008

【語言】控制流程敘述 - Control Flow Statement

@
  對於程式語言而言,敘述通常被認為是一支程式的最小組成單位。例如簡單的指派(assignment) x = 5 或是斷言(assertion) a < b 都屬於一個敘述。


  不過,其實程式語言總歸而言只具有三種敘述結構,被稱為控制流程(control flow)敘述。分別為循序(sequence)結構條件(condition,或稱 selection)結構、與重複(iteration,或稱 repetition)結構

  循序結構相當直覺且簡單。由字面上解釋,即代表程式以由上而下、有順序性的方式一個敘述接著一個敘述執行。例如:

print "這是第一行,程式會先執行這裏";
print "這是第二行,我會在第一行執行之後執行";
print "這是第三行,我會在第二行執行之後執行";

  條件結構則是代表程式在執行時,會依據條件值來改變程式執行的順序。當滿足條件時,會執行某一敘述區塊,若條件不滿足時,則執行另一敘述區塊。例如常見的 ifswitch 敘述:

input a, b;
if (a > b)
{
    print "a 大於 b";
}
else if (a < b)
{
    print "a 小於 b";
}
else
{
    print "a 等於 b";
}

input select;
switch (select)
{
    case 1:
        print "你選了選項 1";

    case 2:
        print "你選了選項 2";

    case 3:
        print "你選了選項 3";

    default:
        print "你選了 1~3 以外的選項";
}

  至於重複結構,就是指反覆執行程式中的某一敘述區塊,直到符合某項條件(利用條件結構)為止。常見的重複結構則分為前測式迴圈(pre-test loop)後測式迴圈(post-test loop)、與計數式迴圈(count-controlled loop)三種。

  前測式迴圈是先測試條件。若條件為真,才執行敘述區塊。當敘述區塊執行完畢後,會再回到測試條件重新測試。若條件仍成立,則再一次執行敘述區塊。如此週而復始下去,直到條件不成立為止。例如常見的 while loop 敘述:

input a, b;
while (a > b)
{
    print a;
    a = a + 1;
}

  後測式迴圈與前測式迴圈類似。唯一的不同點為:其會先執行敘述區塊一次,然後再測試條件。若條件為真,則重複執行,直到條件不成立才會離開迴圈。因此,迴圈內的敘述至少會被執行一次。例如常見的 do-while loop 敘述:

input a, b;
do
{
    print a;
    a = a + 1;
} while (a > b);

  而計數式迴圈則不同於兩者。其會利用一個計數器(counter)來記錄迴圈執行的次數,以用於可預測執行次數的情況。例如常見的 for loop 敘述:

input n;
for (i = 1 to n)
{
    print i;
}


  其實,除了這三種結構之外,還有一個可以進行無條件跳躍的 goto 敘述。

  所謂的無條件跳躍指令,指的是無條件將程式執行的順序改變,跳到指定的地方繼續執行。它不像前面提到的迴圈或選擇敘述必須經過判斷,才能決定程式執行的順序,因此威力非常的強大。

  這樣的指令看似方便,卻容易造成程式難以閱讀,也難以除錯。例如:

label:
......
......
goto label;
......
......
goto label;
......
......
goto label;

  因為這樣子的寫法,我們並不能夠清楚的知道:此時究竟是由哪一個 goto 跳到 label 的。所以一般來說,goto 這類無條件跳躍指令是不太被建議使用的。

0 回覆:

張貼留言