找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2778|回復(fù): 2
打印 上一主題 下一主題
收起左側(cè)

C語言goto,break和continue語句,C語言goto,break和continue跳轉(zhuǎn)語句詳解

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:896066 發(fā)表于 2021-3-30 01:27 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
控制程序流程跳轉(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
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏3 分享淘帖 頂 踩
回復(fù)

使用道具 舉報

沙發(fā)
ID:46065 發(fā)表于 2021-3-30 09:54 | 只看該作者
非常好的總結(jié),感謝樓主!
回復(fù)

使用道具 舉報

板凳
ID:299193 發(fā)表于 2021-4-11 21:49 | 只看該作者
不錯,謝謝分享!好資料,51黑有你更精彩!!!
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表