goto,break和continue語句,C語言goto,break和continue跳轉語句詳解

2020-07-16 10:04:21
控制程式流程跳轉的通常有 goto、break、continue 等語句。

goto語句

goto 語句是一種無條件流程跳轉語句,通常 goto 語句與 if 語句結合使用,當滿足一定條件時,程式流程跳轉到指定標號處,接著往下執行。

定義語句標識的格式如下。

語句標識:語句;

其中,“語句標識”可以是任一個合法的識別符號,如 pos_1、pos_2、label_1、label_2 等都是合法的語句標識。注意,語句標識後的冒號不能省略。

goto 語句的呼叫語法格式為:

goto 語句標號;

程式將從對應“語句標號”的程式碼處開始往下執行。

【例 1】分析以下程式,了解 goto 語句的使用。
#include<stdio.h>
int main (void){
    int n;
    pos_1:
        printf("請輸入一個正整數:");
        scanf("%d",&n);
        if(n<0)
        {
            printf("輸入錯誤!n");
            goto pos_1;
        }
        printf("成功輸入正整數:%dn",n);
        return 0;
}
程式碼分析:在上述程式程式碼中,有一個語句標號 pos_1。該程式的執行流程如下:
  1. pos_1 標號處。先提示使用者“請輸入一個正整數:”。
  2. 如果使用者輸入的是正整數,則提示“成功輸入正整數:***”。執行第 4 步。
  3. 如果使用者輸入的是負數,則進入迴圈體,提示“輸人錯誤!”。程式執行流程跳轉到 pos_1 處,即跳轉到第 1 步,繼續往下執行。
  4. 程式結束。

程式執行結果:假設某次執行,依次輸入 -2、-6、3 等數位,其執行結果如下:
請輸人一個正整數:-2
輸入錯誤!
請輸入一個正整數:-6
輸入錯誤!
請輸入一個正整數:3
成功輸入正整數:3

通過上述執行流程及執行結果的分析,可以發現該例中使用 goto 跳轉語句實現了回圈的功能。故可以使用迴圈結構的程式碼替換該 goto 結構的程式碼。

等價實現程式碼:
#include<stdio.h>
int main (void)
{
    int n;
    printf ("請輸入一個正整數:");
    scanf("%d",&n);
    while(n<0)
    {
        printf ("輸入錯誤!n");
        printf ("請輸入一個正整數:");
        scanf("%d",&n);
    }
    printf ("成功輸入正整數:%dn",n);
    return 0;
}
使用 goto 語句可能會造成程式層次不清晰,可讀性差,故在實際程式設計中,應盡量少使用或避免使用 goto 語句。

break語句

當執行到回圈體中的 break 語句時,將終止 break 所在該層的迴圈,從該層迴圈體之後的語句開始繼續執行。

break 的執行流程如下所示。

單重回圈情況:選用 while 迴圈結構示意,do-while 迴圈、for 迴圈同樣適用。

while (迴圈判斷表示式)
{
    ...
    if(條件表示式)
        break;
    迴圈體中break後的語句;
}
迴圈體後的第 1 條語句;
迴圈體後的第 2 條語句;
...

在迴圈體中,當滿足一定條件執行到 break 語句時,終止 break 所在的該層迴圈,即“迴圈體中 break 後的語句”部分將不再被執行,程式執行流程轉向從“迴圈結構後的第 1 條語句”處,開始繼續往後執行。

雙重回圈情況:使用雙重 for 迴圈巢狀結構示意,其他型別的迴圈巢狀組合同樣適用。

for (;迴圈判斷表示式1;)
{
    ...
    for(;迴圈判斷表示式2;)
    {
        ...
        if(條件表示式)
            break;
        內層迴圈體中break後的語句;
    }
    內層迴圈結構後的第1條語句; 內層迴圈結構後的第2條語句;
    ...
}

在內層迴圈中,當滿足一定條件執行到 break 語句時,僅結束 break 所在內層迴圈的執行(在本輪外層迴圈中,“內層迴圈體中 break 後的語句”部分不再被執行),程式執行流程跳轉到“內層迴圈結構後的第 1 條語句”所在的外層迴圈體處,開始繼續執行。

【例 2】分析以下程式輸出結果,掌握 break 語句的使用方法。
#include<stdio.h>
int main (void)
{
    int s=0,i;
    for(i=1;i<=10;i++)
    {
        if (6==i)
            break;
        s+=i;
    }
    printf("sum=%dn", s);
    return 0;
}
當 i< 6時,均不執行 break 語句,可以將其忽略。即 i<6 時,等價於如下程式碼。
for(i=1;i<=10;i++)
{
    s+=i;
}
相當於執行了加法運算 s=1+2+3+4+5=15。

當 i=6 時,執行 break 語句,立即終止 break 語句所在的該層 for 迴圈,故 i=6 並沒有累加到 s 上,接著從 for 迴圈結構後的第一條語句 printf("sum=%dn",s); 處開始繼續執行。

程式執行結果為:
sum=15

continue語句

在迴圈體中設定 continue 語句,同樣可以改變迴圈的執行流程,只不過它不像 break 那樣結束整個迴圈體,而是僅結束本次迴圈體的執行,提前進入下一次迴圈。

continue 語句的執行流程如下所示(選用 for 迴圈結構示意)。

for(初始表示式;迴圈判斷表示式;增量表示式)
{
   ...
   if(條件表示式)
       continue;
    迴圈體中continue後的所有語句;
}

當在上述 for 迴圈中執行到 continue 語句時,本次迴圈體的執行流程將跳過“迴圈體中 continue 後的所有語句”,接著執行“增量表示式”部分,然後執行“迴圈判斷表示式”,即提前進入下一次回圈的準備工作。

【例 3】分析以下程式輸出結果,掌握 continue 語句的使用方法。
#include<stdio.h>
int main (void)
{
    int s=0,i;
    for(i=1;i<=10;i++)
    {
        if(6==i)
            continue;
        s+=i;
    }
    printf("sum=%dn",s);
    return 0;
}
程式分析:
1) 當 i≠6 時,也就是 i≤5 時,忽略 continue 語句,相當於:
for(i=1;i<=10; i++)
{
    s+=i;
}
即:s=1+2+3+4+5

2) 當 i=6 時,執行 continue 語句,本次迴圈(i=6)體中 continue 後的語句 s+=i; 將被忽略,接著執行增量表示式 i++,相當於 i=6 沒有累加到 s 上。

3) 後續的迴圈中 i 不再可能等於 6,故 continue 語句也將被忽略。故程式功能相當於把 1?10 中除 6 之外的 9 個數累加到 s 上。即 s=1+2+3+4+5+7+8+9+10=49。

執行結果為:
sum=49