控制程式流程跳轉的通常有 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。該程式的執行流程如下:
-
pos_1 標號處。先提示使用者“請輸入一個正整數:”。
-
如果使用者輸入的是正整數,則提示“成功輸入正整數:***”。執行第 4 步。
-
如果使用者輸入的是負數,則進入迴圈體,提示“輸人錯誤!”。程式執行流程跳轉到 pos_1 處,即跳轉到第 1 步,繼續往下執行。
-
程式結束。
程式執行結果:假設某次執行,依次輸入 -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