控制程序流程跳轉(zhuǎn)的通常有 goto、break、continue 等語句。
goto語句goto 語句是一種無條件流程跳轉(zhuǎn)語句,通常 goto 語句與 if 語句結(jié)合使用,當滿足一定條件時,程序流程跳轉(zhuǎn)到指定標號處,接著往下執(zhí)行。
定義語句標識的格式如下。
語句標識:語句; 其中,“語句標識”可以是任一個合法的標識符,如 pos_1、pos_2、label_1、label_2 等都是合法的語句標識。注意,語句標識后的冒號不能省略。
goto 語句的調(diào)用語法格式為:
goto 語句標號; 程序?qū)膶?yīng)“語句標號”的代碼處開始往下執(zhí)行。
【例 1】分析以下程序,了解 goto 語句的使用。
- #include<stdio.h>
- int main (void){
- int n;
- pos_1:
- printf("請輸入一個正整數(shù):");
- scanf("%d",&n);
- if(n<0)
- {
- printf("輸入錯誤!\n");
- goto pos_1;
- }
- printf("成功輸入正整數(shù):%d\n",n);
- return 0;
- }
代碼分析:在上述程序代碼中,有一個語句標號 pos_1。該程序的執(zhí)行流程如下:- pos_1 標號處。先提示用戶“請輸入一個正整數(shù):”。
- 如果用戶輸入的是正整數(shù),則提示“成功輸入正整數(shù):***”。執(zhí)行第 4 步。
- 如果用戶輸入的是負數(shù),則進入循環(huán)體,提示“輸人錯誤!”。程序執(zhí)行流程跳轉(zhuǎn)到 pos_1 處,即跳轉(zhuǎn)到第 1 步,繼續(xù)往下執(zhí)行。
- 程序結(jié)束。
程序運行結(jié)果:假設(shè)某次運行,依次輸入 -2、-6、3 等數(shù)字,其運行結(jié)果如下:
請輸人一個正整數(shù):-2
輸入錯誤!
請輸入一個正整數(shù):-6
輸入錯誤!
請輸入一個正整數(shù):3
成功輸入正整數(shù):3
通過上述執(zhí)行流程及運行結(jié)果的分析,可以發(fā)現(xiàn)該例中使用 goto 跳轉(zhuǎn)語句實現(xiàn)了循環(huán)的功能。故可以使用循環(huán)結(jié)構(gòu)的代碼替換該 goto 結(jié)構(gòu)的代碼。
等價實現(xiàn)代碼:- #include<stdio.h>
- int main (void)
- {
- int n;
- printf ("請輸入一個正整數(shù):");
- scanf("%d",&n);
- while(n<0)
- {
- printf ("輸入錯誤!\n");
- printf ("請輸入一個正整數(shù):");
- scanf("%d",&n);
- }
- printf ("成功輸入正整數(shù):%d\n",n);
- return 0;
- }
使用 goto 語句可能會造成程序?qū)哟尾磺逦,可讀性差,故在實際編程中,應(yīng)盡量少使用或避免使用 goto 語句。
break語句當執(zhí)行到循環(huán)體中的 break 語句時,將終止 break 所在該層的循環(huán),從該層循環(huán)體之后的語句開始繼續(xù)執(zhí)行。
break 的執(zhí)行流程如下所示。
單重循環(huán)情況:選用 while 循環(huán)結(jié)構(gòu)示意,do-while 循環(huán)、for 循環(huán)同樣適用。
while (循環(huán)判斷表達式)
{
...
if(條件表達式)
break;
循環(huán)體中break后的語句;
}
循環(huán)體后的第 1 條語句;
循環(huán)體后的第 2 條語句;
... 在循環(huán)體中,當滿足一定條件執(zhí)行到 break 語句時,終止 break 所在的該層循環(huán),即“循環(huán)體中 break 后的語句”部分將不再被執(zhí)行,程序執(zhí)行流程轉(zhuǎn)向從“循環(huán)結(jié)構(gòu)后的第 1 條語句”處,開始繼續(xù)往后執(zhí)行。
雙重循環(huán)情況:使用雙重 for 循環(huán)嵌套結(jié)構(gòu)示意,其他類型的循環(huán)嵌套組合同樣適用。
for (;循環(huán)判斷表達式1;)
{
...
for(;循環(huán)判斷表達式2;)
{
...
if(條件表達式)
break;
內(nèi)層循環(huán)體中break后的語句;
}
內(nèi)層循環(huán)結(jié)構(gòu)后的第1條語句; 內(nèi)層循環(huán)結(jié)構(gòu)后的第2條語句;
...
} 在內(nèi)層循環(huán)中,當滿足一定條件執(zhí)行到 break 語句時,僅結(jié)束 break 所在內(nèi)層循環(huán)的執(zhí)行(在本輪外層循環(huán)中,“內(nèi)層循環(huán)體中 break 后的語句”部分不再被執(zhí)行),程序執(zhí)行流程跳轉(zhuǎn)到“內(nèi)層循環(huán)結(jié)構(gòu)后的第 1 條語句”所在的外層循環(huán)體處,開始繼續(xù)執(zhí)行。
【例 2】分析以下程序輸出結(jié)果,掌握 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時,均不執(zhí)行 break 語句,可以將其忽略。即 i<6 時,等價于如下代碼。
- for(i=1;i<=10;i++)
- {
- s+=i;
- }
相當于執(zhí)行了加法運算 s=1+2+3+4+5=15。
當 i=6 時,執(zhí)行 break 語句,立即終止 break 語句所在的該層 for 循環(huán),故 i=6 并沒有累加到 s 上,接著從 for 循環(huán)結(jié)構(gòu)后的第一條語句 printf("sum=%d\n",s); 處開始繼續(xù)執(zhí)行。
程序運行結(jié)果為:
sum=15
continue語句在循環(huán)體中設(shè)置 continue 語句,同樣可以改變循環(huán)的執(zhí)行流程,只不過它不像 break 那樣結(jié)束整個循環(huán)體,而是僅結(jié)束本次循環(huán)體的執(zhí)行,提前進入下一次循環(huán)。
continue 語句的執(zhí)行流程如下所示(選用 for 循環(huán)結(jié)構(gòu)示意)。
for(初始表達式;循環(huán)判斷表達式;增量表達式)
{
...
if(條件表達式)
continue;
循環(huán)體中continue后的所有語句;
} 當在上述 for 循環(huán)中執(zhí)行到 continue 語句時,本次循環(huán)體的執(zhí)行流程將跳過“循環(huán)體中 continue 后的所有語句”,接著執(zhí)行“增量表達式”部分,然后執(zhí)行“循環(huán)判斷表達式”,即提前進入下一次循環(huán)的準備工作。
【例 3】分析以下程序輸出結(jié)果,掌握 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 時,執(zhí)行 continue 語句,本次循環(huán)(i=6)體中 continue 后的語句 s+=i; 將被忽略,接著執(zhí)行增量表達式 i++,相當于 i=6 沒有累加到 s 上。
3) 后續(xù)的循環(huán)中 i 不再可能等于 6,故 continue 語句也將被忽略。故程序功能相當于把 1〜10 中除 6 之外的 9 個數(shù)累加到 s 上。即 s=1+2+3+4+5+7+8+9+10=49。
運行結(jié)果為:
sum=49
|