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); }