控制程序流程跳轉的通常有 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("成功輸入正整數:%d\n",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 ("成功輸入正整數:%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<stdio.h>
- 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<stdio.h>
- 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
|