控制程式流程跳轉的通常有 goto、break、continue 等語句。
goto語句
goto 語句是一種無條件流程跳轉語句,通常 goto 語句與 if 語句結合使用,當滿足一定條件時,程式流程跳轉到指定标号處,接着往下執行。
定義語句辨別的格式如下。
語句辨別:語句;
其中,“語句辨別”可以是任一個合法的辨別符,如 pos_1、pos_2、label_1、label_2 等都是合法的語句辨別。注意,語句辨別後的冒号不能省略。
goto 語句的調用文法格式為:
goto 語句标号;
程式将從對應“語句标号”的代碼處開始往下執行。
【例 1】分析以下程式,了解 goto 語句的使用。
#include
int main (void){
int n;
pos_1:
printf("請輸入一個正整數:");
scanf("%d",&n);
if(n<0)
{
printf("輸入錯誤!\n");
goto pos_1;
}
printf("成功輸入正整數:%d\n",n);
return 0;
}
代碼分析:在上述程式代碼中,有一個語句标号 pos_1。該程式的執行流程如下:
pos_1 标号處。先提示使用者“請輸入一個正整數:”。
如果使用者輸入的是正整數,則提示“成功輸入正整數:***”。執行第 4 步。
如果使用者輸入的是負數,則進入循環體,提示“輸人錯誤!”。程式執行流程跳轉到 pos_1 處,即跳轉到第 1 步,繼續往下執行。
程式結束。
程式運作結果:假設某次運作,依次輸入 -2、-6、3 等數字,其運作結果如下:
請輸人一個正整數:-2
輸入錯誤!
請輸入一個正整數:-6
輸入錯誤!
請輸入一個正整數:3
成功輸入正整數:3
通過上述執行流程及運作結果的分析,可以發現該例中使用 goto 跳轉語句實作了循環的功能。故可以使用循環結構的代碼替換該 goto 結構的代碼。
等價實作代碼:
#include
int main (void)
{
int n;
printf ("請輸入一個正整數:");
scanf("%d",&n);
while(n<0)
{
printf ("輸入錯誤!\n");
printf ("請輸入一個正整數:");
scanf("%d",&n);
}
printf ("成功輸入正整數:%d\n",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
int main (void)
{
int s=0,i;
for(i=1;i<=10;i++)
{
if (6==i)
break;
s+=i;
}
printf("sum=%d\n", 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=%d\n",s); 處開始繼續執行。
程式運作結果為:
sum=15
continue語句
在循環體中設定 continue 語句,同樣可以改變循環的執行流程,隻不過它不像 break 那樣結束整個循環體,而是僅結束本次循環體的執行,提前進入下一次循環。
continue 語句的執行流程如下所示(選用 for 循環結構示意)。
for(初始表達式;循環判斷表達式;增量表達式)
{
...
if(條件表達式)
continue;
循環體中continue後的所有語句;
}
當在上述 for 循環中執行到 continue 語句時,本次循環體的執行流程将跳過“循環體中 continue 後的所有語句”,接着執行“增量表達式”部分,然後執行“循環判斷表達式”,即提前進入下一次循環的準備工作。
【例 3】分析以下程式輸出結果,掌握 continue 語句的使用方法。
#include
int main (void)
{
int s=0,i;
for(i=1;i<=10;i++)
{
if(6==i)
continue;
s+=i;
}
printf("sum=%d\n",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