欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 7230|回復: 3
打印 上一主題 下一主題
收起左側

break、continue和goto語句在C語言中的區(qū)別和用法

[復制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:109770 發(fā)表于 2016-3-22 23:21 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
<break語句>
break語句通常用在循環(huán)語句和開關語句中。當break用于開關語句switch中
時, 可使程序跳出switch而執(zhí)行switch以后的語句; 如果沒有break語句, 則將
成為一個死循環(huán)而無法退出。
當break語句用于do-while、for、while循環(huán)語句中時, 可使程序終止循環(huán)
而執(zhí)行循環(huán)后面的語句, 通常break語句總是與if語句聯(lián)在一起。 即滿足條件時
便跳出循環(huán)。
例:
main()
{
int i=0;
char c;
while(1)                 /*設置循環(huán)*/
{
c='\0';             /*變量賦初值*/
while(c!=13&&c!=27) /*鍵盤接收字符直到按回車或Esc鍵*/
{
c=getch();
printf("%c\n", c);
}
if(c==27)
break;          /*判斷若按Esc鍵則退出循環(huán)*/
i++;
printf("The No. is %d\n", i);
}
printf("The end");
}
注意:
1. break語句對if-else的條件語句不起作用。
2. 在多層循環(huán)中, 一個break語句只向外跳一層。
<continue 語句>
continue語句的作用是跳過本循環(huán)中剩余的語句而強行執(zhí)行下一次循環(huán)。
continue語句只用在for、while、do-while等循環(huán)體中, 常與if條件語句一
起使用, 用來加速循環(huán)。
例:
main()
{
char c;
while(c!=0X0D)      /*不是回車符則循環(huán)*/
{
c=getch();
if(c==0X1B)
continue; /*若按Esc鍵不輸出便進行下次循環(huán)*/
printf("%c\n", c);
}
}
<goto 語句>
goto語句是一種無條件轉(zhuǎn)移語句, 與BASIC中的goto語句相似。goto 語句的
使用格式為:
goto 標號;
其中標號是Turbo C2.0中一個有效的標識符, 這個標識符加上一個":" 一起
出現(xiàn)在函數(shù)內(nèi)某處, 執(zhí)行goto語句后, 程序?qū)⑻D(zhuǎn)到該標號處并執(zhí)行其后的語句。
另外標號必須與goto語句同處于一個函數(shù)中, 但可以不在一個循環(huán)層中。通常
goto語句與if條件語句連用, 當滿足某一條件時, 程序跳到標號處運行。
goto語句通常不用, 主要因為它將使程序?qū)哟尾磺? 且不易讀, 但在多層嵌
套退出時, 用goto語句則比較合理。
例:
main()
{
int i=0;
char c;
while(1)
{
c='\0';
while(c!=13)
{
c=getch();
if(c==27)
goto quit;
printf("%c\n", c);
}
i++;
printf("The No. is %d\n", i);
}
quit:
printf("The end");
}



分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發(fā)
ID:109770 發(fā)表于 2016-3-22 23:21 | 只看該作者
goto語句
goto語句的發(fā)展歷程
  問題起源:
  60年代中期以后,計算機硬件技術日益進步,計算的存貯容量、運算速度和可靠性明顯提高,生產(chǎn)硬件的成本不斷降低。計算機價格的下跌為它的廣泛應用創(chuàng)造了極好的條件。在這種形勢下,迫切要求計算機軟件也能與之相適應。因而,一些開發(fā)大型軟件系統(tǒng)的要求提了出來。然而軟件技術的進步一直未能滿足形勢發(fā)展的需要,在大型軟件的開發(fā)過程中出現(xiàn)了復雜程度高、研制周期長、正確性難以保證的三大難題。遇到的問題找不到解決辦法,致使問題堆積起來,形成了人們難以控制的局面,出現(xiàn)了所謂的“軟件危機”。為了克服這一危機,一方面需要對程序設計方法、程序的正確性和軟件的可靠性等問題進行系列的研究;另一方面,也需要對軟件的編制、測試、維護和管理的方法進行研究,從而產(chǎn)生了程序設計方法學。
  goto語句是有害的觀點:
  1968年,E·W·代克斯特拉首先提出“GOTO語句是有害的”論點,向傳統(tǒng)程序設計方法提出了挑戰(zhàn),從而引起了人們對程序設計方法討論的普遍重視。
  goto語句的爭論:
  在60年代末和70年代初,關于GOTO語句的用法的爭論比較激烈。主張從高級程序語言中去掉GOTO語句的人認為,GOTO語句是對程序結構影響最大的一種有害的語句,他們的主要理由是:GOTO語句使程序的靜態(tài)結構和動態(tài)結構不一致,從而使程序難以理解,難以查錯。去掉GOTO語句后,可直接從程序結構上反映程序運行的過程。這樣,不僅使程序結構清晰,便于理解,便于查錯,而且也有利于程序的正確性證明。
  持反對意見的人認為,GOTO語句使用起來比較靈活,而且有些情形能提高程序的效率。若完全刪去GOTO語句,有些情形反而會使程序過于復雜,增加一些不必要的計算量。
  關于goto語句的解決方法:
  1974年,D·E·克努斯對于GOTO語句爭論作了全面公正的評述,其基本觀點是:不加限制地使用GOTO語句,特別是使用往回跳的GOTO語句,會使程序結構難于理解,在這種情形,應盡量避免使用GOTO語句。但在另外一些情況下,為了提高程序的效率,同時又不致于破壞程序的良好結構,有控制地使用一些GOTO語句也是必要的。用他的話來說就是:“在有些情形,我主張刪掉GOTO語句;在另外一些情形,則主張引進GOTO語句!睆拇,使這場長達10年之久的爭論得以平息。
  后來,G·加科皮尼和C·波姆從理論上證明了:任何程序都可以用順序、分支和重復結構表示出來。這個結論表明,從高級程序語言中去掉GOTO語句并不影響高級程序語言的編程能力,而且編寫的程序的結構更加清晰。
  goto語句的結果:
  在C/C++等高級編程語言中保留了goto語句,但被建議不用或少用。在一些更新的高級編程語言,如Java不提供goto語句,它雖然指定goto作為關鍵字,但不支持它的使 用,使程序簡潔易讀;盡管如此后來的c#還是支持goto語句的,goto語句一個好處就是可以保證chengx程序存在唯一的出口,避免了過于龐大的if嵌套。
回復

使用道具 舉報

板凳
ID:109770 發(fā)表于 2016-3-22 23:22 | 只看該作者
goto語句在C/C++語言中可謂是“臭名昭著”,乃至有的書(或公司的編程規(guī)范)提出禁用goto語句的說法。其結果就是,造成有的程序員一看到goto語句在某程序中被使用,就本能地認為這個程序?qū)懙煤堋袄。此外,也使得有些程序員因為使用了goto語句而覺得自己很不專業(yè)。其實,凡事都不能太偏激,goto語句運用得好能大大地簡化程序,以及提高程序的可讀性和可維護性。在開始示例其好處之前,先用一些統(tǒng)計數(shù)據(jù)來說明goto語句并沒有因為“臭名昭著”而被拋棄,這些統(tǒng)計數(shù)據(jù)可能并不是百分之百的精確,但很具有說服力。對于操作系統(tǒng),Linux-2.6.21內(nèi)核使用了20,333個goto語句,VxWorks-6.2則使用了9142個,最后941個goto語句被運用到了rtems-4.9.2中;另外,glibc-2.9庫使用了1750個goto語句。所有這些統(tǒng)計數(shù)據(jù)都表明,goto語言并沒有想象的那樣可怕而招到禁用,其關鍵在于 —— 恰當?shù)剡\用它。

圖1是一個沒有采用goto語句編寫的函數(shù),其中存在多處出錯處理的代碼,比如113~115行、120~122行和126~129行。采用這種分布式的出錯處理,很容易出現(xiàn)遺漏釋放前面已經(jīng)分配的資源,從而造成資源泄漏問題。如果采用goto語句,則能取得更好的效果。

example.c
00097: int queue_init (queue_t ** _pp_queue, int _size)
00098: {
00099:     pthread_mutexattr_t attr;
00100:     queue_t *queue;
00101:
00102:        queue = (queue_t *) malloc(sizeof(queue_t));
00103:        if (0 == queue) {
00104:         return -1;
00105:     }
00106:     *_pp_queue = queue;
00107:
00108:     memset (queue, 0, sizeof (*queue));
00109:     queue->size_ = _size;
00110:
00111:     pthread_mutexattr_init (&attr);
00112:     if (0 != pthread_mutex_init(&queue->mutex_, &attr)) {
00113:         pthread_mutexattr_destroy (&attr);
00114:         free (queue);
00115:         return -1;
00116:     }
00117:
00118:     queue->messages_ = (void **) malloc (queue->size_ * sizeof (void *));
00119:     if (0 == queue->messages_) {
00120:         pthread_mutexattr_destroy (&attr);
00121:         free (queue);
00122:         return -1;
00123:     }
00124:
00125:     if (0 != sem_init(&queue->sem_put_, 0, queue->size_)) {
00126:         free (queue->messages_);
00127:         pthread_mutexattr_destroy (&attr);
00128:         free (queue);
00129:         return -1;
00130:     }
00131:
00132:     pthread_mutexattr_destroy (&attr);
00133:
00134:     return 0;
00135: }


圖1

圖2是采用goto語句所編寫的另一個版本,與不采用goto語句的版本相比,程序更加的簡單,且在出錯處理的地方大都使用goto語句跳轉(zhuǎn)到程序的末尾進行處理。goto語句除了可以用在這里所示例的出錯處理中,還可以用在其它的程序邏輯中以簡化程序并提高閱讀性。
example.c
00053: int queue_init (queue_t ** _pp_queue, int _size)
00054: {
00055:     pthread_mutexattr_t attr;
00056:     queue_t *queue;
00057:
00058:     queue = (queue_t *) malloc(sizeof(queue_t));
00059:         if (0 == queue) {
00060:         return -1;
00061:     }
00062:     *_pp_queue = queue;
00063:
00064:     memset (queue, 0, sizeof (*queue));
00065:     queue->size_ = _size;
00066:
00067:     pthread_mutexattr_init (&attr);
00068:     if (0 != pthread_mutex_init(&queue->mutex_, &attr)) {
00069:         goto error;
00070:     }
00071:
00072:     queue->messages_ = (void **) malloc (queue->size_ * sizeof (void *));
00073:     if (0 == queue->messages_) {
00074:         goto error;
00075:     }
00076:
00077:     if (0 != sem_init(&queue->sem_put_, 0, queue->size_)) {
00078:         goto error1;
00079:     }
00080:
00081:     pthread_mutexattr_destroy (&attr);
00082:
00083:     return 0;
00084:
00085: error1:
00086:     free (queue->messages_);
00087: error:
00088:     pthread_mutexattr_destroy (&attr);
00089:     free (queue);
00090:     return -1;
00091: }


圖2

使用goto語句時需要注意以下原則:
1) 不要過份地使用。比如圖2中的60行就沒有采用goto語句跳到程序的最后面,之所以這里不使用goto是為了閱讀方便。因為程序此時還沒有分配資源,所以直接返回顯得更加的直接了當。還有就是,在這個函數(shù)中如果存在使用goto語句都意味著出錯了且需要釋放資源。如果將60行的語句也改為goto就破壞了這個函數(shù)中使用goto語句的一致性。
2) 不要讓goto語句形成一個環(huán)。使用goto語句應形成一條線,從一點跳到另一點。當然,如果goto語句的使用沒有破壞可讀性,那可以適當?shù)目紤]打破這一原則。


回復

使用道具 舉報

地板
ID:109770 發(fā)表于 2016-3-22 23:25 | 只看該作者
在中斷中使用goto語句:LZ用匯編寫過程序,就應該明白
當你進入中斷服務程序時,單片機本身會備份當前程序狀態(tài),中斷部分執(zhí)行完畢后會用RETI恢復現(xiàn)場
如果這時候主程序是在執(zhí)行一個子程序時進入的中斷,那么中斷執(zhí)行完畢后自然會繼續(xù)執(zhí)行之前的子程序毫無影響,問題就在這...中斷部分用LJMP之類跳轉(zhuǎn)指令(相當于goto),自然是“合法”得跳轉(zhuǎn)到目的地,但之前被執(zhí)行到一半的子程序?qū)粡氐状驍,程序架構一旦沒處理好這部分,出問題也在所難免,比如一個狀態(tài)機,在狀態(tài)改變時的那一步被打斷......
這樣的話,要么你在所有不可打斷處關閉中斷,處理完畢后再打開,但這樣程序可移植性等等都將被破壞
要么用類似如下主循環(huán):
while(1)
{
    工作1;
        跳轉(zhuǎn)變量檢測;
    工作2;
        跳轉(zhuǎn)變量檢測;
    工作3;
        跳轉(zhuǎn)變量檢測;
    工作4;
        跳轉(zhuǎn)變量檢測;
    ....
}
這樣看似語句啰嗦不少,但每次大循環(huán)也就犧牲若干個微秒便可保證響應的速度



回復

使用道具 舉報

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

本版積分規(guī)則

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

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

快速回復 返回頂部 返回列表