C語言中的break、continue和goto三者的區別與用法


exit的話是在stdlib的頭文件里面定義的,他是的程序退出,正如exit的字面意思一樣
break的話是終止當前循環繼續進行循環后面的語句,但是程序照樣還在進行
只能while switch for中使用break;
但是可以在任何語句中用exit;

本文轉載:http://blog.chinaunix.net/uid-26715658-id-3254915.html

break和continue的使用范圍比較一致,兩都可以用於循環,其中break還可以用於switch。功能上也有一定的相似性,break就相當於退學,continue則相當於跳級。對於break,程序究竟跳到哪兒比較好理解。但是continue究竟跳到哪兒去了,初學者可能有些疑惑,不妨就當它跳到了循環體最后一句語句的后面。
  如果它們處在由多重循環和switch組成的圈圈里,那么它們就對包括它們的最里層起作用。於是,設想一下子跳出多重循環的人可能忘不了goto。 

break語句不能用於循環語句(如for循環或while循環)和switch語句之外的任何其他語句中。

 Continue語句和Break語句的區別是:continue語句只結束本次循環,而不是終止整個循環的執行。而Break語句則是結束整個循環過程,不再判斷執行循環的條件是否成立。

引用:從上世紀60年代后期開始,不主張使用goto語句。……所有使用goto的程序都可以改寫成不用goto。
  筆記:goto是一個很有爭議的語句,語多書本建議少用或不用它,我個人的習慣是堅決不用。不過,至於“上世紀60年代”這個說法,我倒是一直不知道。因為我自己學習BASIC已經是1994年,那時候學的是帶行號的GW-BASIC,goto是必須用到的語句。莫非當時我們學校開設的課程居然是落后二十年的內容?
  林銳博士對goto另有看法,他說:“錯誤是程序員自己造成的,不是goto的過錯。goto至少有一處可顯神通,它能從多重循環中咻地一下子跳到外面,……就像房子着火了,來不及從樓梯一級一級往下走,可從窗口跳出火坑。……”(《高質量C++/C編程指南》第32頁)
  我寫的程序目前還沒有超越三級循環。從最里層往外跳,如果跳一層,就break,如果跳兩層或三層,一是這種可能性很小,二是如果真的碰到了,我就用其它條件來控制外層循環是否繼續break,自從1997年進入結構化的程序設計以來,我的確完全拋棄了goto。——VB中的“On Error Goto”除外,出現錯誤,自然不管在哪一層,都給我跳進錯誤處理中。
  goto的目標是一個標號,這個標號的起名倒有點意思,因為標號只用於goto,所以它的名字可以與任何變量名以及其它標識符一樣而不產生重名。以前的程序是帶行號的,所以就“goto 行號”,現在程序不帶行號了,但是允許在任何地方加標號。編譯器在碰到它們的時候,大概就是憑其后頭的冒號來判斷這個名字不需要檢驗合法性。那么,C++中已有的“public:”算不算標號呢?
  為此,我做了個實驗:實驗內容一是我在類的聲明里加入了一行“pub:”,二是我在程序段中加入了一行“public:”。結果發現兩都都不能通過編譯。也就是說,實驗一說明在類定義這樣的地方不允許使用標號(也用不着,因為它不在任何函數內部,goto是運行時的事,與編譯無關,而且goto不允許跨函數跳越。),實驗二說明在程序段中的標號不允許使用保留字。

下面舉例說明

#include 
void main() 
{
int n, m;
/*這個循環輸出1 2 3 4, 在n是5的時候循環退出*/ 
for ( n = 1; n <= 10; n ++ ) 
{
   if ( n == 5 )
    break; 
   printf( " %d", n );
}

printf( "\n" );
/*這個循環輸出1 2 3 4 6 7*/
for ( m = 1; m <= 10; m ++ ) 
{
   /*在m是5的時候沒有執行當次循環的其他語句,所以未輸出5*/ 
   if ( m == 5 ) 
    continue;
   /*在m是8的時候循環跳轉到RET處,連End都不會輸出,如果是break,還能輸出End*/
   if ( m == 8 )
   {
    goto RET;
   }
   printf(" %d",m); 
}

printf ("End");

RET:
return;
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM