C Primer Plus 第7章 C控制語句:分支和跳轉 7.6 continue和break

7.6.1 continue語句ui

該語句能夠用於三種循環形式spa

當運行到該語句時,它將致使剩餘的迭代部分被忽略,並開始下一次的迭代。code

若是continue語句處於嵌套結構中,它僅僅影響它的最裏層的結構。ip

程序清單7.9  skippart.cget

/*skippart.c--使用continue跳過部分循環*/
#include <stdio.h>
int main (void)
{
    const float MIN = 0.0f;
    const float MAX = 100.0f;

    float score;
    float total = 0.0f;
    int n = 0;
    float min = MAX;
    float max = MIN;

    printf("Enter the first score (q to quit):");
    while(scanf("%f",&score)==1)
    {
        if(score<MIN || score>MAX)
        {
            printf("%0.1f is an invalid value.Try again:",score);
            continue;
        }
        printf("Accepting %0.1f: \n",score);
        min = (score<min)?score:min;
        max = (score>max)?score:max;
        total += score;
        n++;
        printf("Enter next score (q to quit):");
    }
    if(n>0)
    {
        printf("Average of %d scores is %0.1f.\n",n,total / n);
        printf("Low = %0.1f,high = %0.1f \n",min,max);
    }
    else
        printf("No valid scores were entered.\n");
    return 0;
}

若是程序輸入188,那麼程序就會說明:188 is an invalid value.而後,continue語句致使程序跳過循環其他用於處理有效輸入的部分。開始下一個循環週期,試圖讀取下一次輸入值。it

在這種狀況下,使用continue的一個好處是能夠在主語句中消除一級縮排。加強可讀性。io

continue的另外一個用處是做爲佔位符。例如,下面的循環讀取並丟棄輸入,直到一行的末尾(包括行尾字符):for循環

while (getchar()!='\n')class

;object

當程序已經從一行中讀取了一些輸入並須要跳到下一行的開始時,使用上面的語句很方便。問題是孤立的分號難以被注意。若是使用continue,代碼就更具備可讀性,以下所示:

while (getchar()!='\n')

    continue;

固然,若是它不是簡化了代碼,而是使代碼更加複雜了,就不要使用continue.

您已經看到了continue語句致使循環體的剩餘部分被跳過。那麼在什麼地方繼續循環呢?

對於while和do while循環,continue語句以後發生的動做是求循環判斷表達式的值考慮下面的循環體:

    int count = 0;
    char ch;
    while(count < 10)
    {
        ch = getchar();
        if(ch=='\n')
            continue;
        putchar(ch);
        count++;
    }

它讀取10個字符(換行符除外,由於當ch爲換行符時會跳過count++;語句)並回顯它們,其中不包括換行符。continue被執行時,下一個被求值 的表達式是循環判斷條件。

對於for循環,下一個動做是先求更新表達式的值,而後再求循環判斷表達式的值。考慮下面的循環體:

for(count = 0;count<10;conut++)

{

        ch = getchar();
        if(ch=='\n')
            continue;
        putchar(ch);

}

在本例中,當continue語句被執行時,首先遞增count,而後把count與10相比較。所以,這個循環的動做稍不一樣於while循環的例子。像前面那樣,僅僅顯示非換行字符,但這時換行字符也被包括在計數中,所以它讀取包括換行字符在內的10個字符。

7.6.2  break語句

循環中的break語句致使程序終止包含它的循環,並進行程序的下一階段。

若是break位於嵌套循環裏,它隻影響包含它的最裏面的循環。

有時,break被用於在出現其餘緣由時退出循環。

程序7.10用一個循環計算矩形的面積,若是用戶輸入一個非數字做爲矩形的長度或寬度,那麼循環終止。

/*break.c--使用break退出循環*/
#include <stdio.h>
int main(void)
{
    float length,width;

    printf("Enter the length of the rectangle:\n");
    while(scanf("%f",&length)==1)
    {
        printf("Length = %0.2f: \n",length);
        printf("Enter its width: \n");
        if(scanf("%f",&width)!=1)
            break;
        printf("Width = %0.2f: \n",width);
        printf("Area = %0.2f \n",length*width);
        printf("Enter the length of the rectangle: \n");
    }
    printf("Done.\n");
    return 0;

}

也能夠這樣控制循環:

while(scanf("%f %f",&length,&width)==2)

可是,使用break可使單獨回顯每一個輸入值更加方便。

和continue同樣,當break使代碼更加複雜時不要使用它。

注意:break語句使程序直接轉到緊接着該循環後的第一條語句去執行在for循環中,與continue不一樣,控制段的更新部分也將被跳過嵌套循環中的break語句只是使程序跳出裏層的循環,要跳出外層的循環,則還須要另一個break.

int p,q;
scanf("%d",&p);
while(p>0)
{
    printf("%d",p);
    scanf("%d",&q);
    while(q>0)
    {
        printf("%d",p*q);
        if(q>100)
            break;    //跳出裏層循環
        scanf("%d",&q);
    }
    if(q>100)
        break;        //跳出外層循環
    scanf("%d",&p);
}
相關文章
相關標籤/搜索