久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费
標(biāo)題:
break、continue和goto語句在C語言中的區(qū)別和用法
[打印本頁]
作者:
51黑bing
時(shí)間:
2016-3-22 23:21
標(biāo)題:
break、continue和goto語句在C語言中的區(qū)別和用法
<break語句>
break語句通常用在循環(huán)語句和開關(guān)語句中。當(dāng)break用于開關(guān)語句switch中
時(shí), 可使程序跳出switch而執(zhí)行switch以后的語句; 如果沒有break語句, 則將
成為一個(gè)死循環(huán)而無法退出。
當(dāng)break語句用于do-while、for、while循環(huán)語句中時(shí), 可使程序終止循環(huán)
而執(zhí)行循環(huán)后面的語句, 通常break語句總是與if語句聯(lián)在一起。 即滿足條件時(shí)
便跳出循環(huán)。
例:
main()
{
int i=0;
char c;
while(1) /*設(shè)置循環(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)中, 一個(gè)break語句只向外跳一層。
<continue 語句>
continue語句的作用是跳過本循環(huán)中剩余的語句而強(qiáng)行執(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鍵不輸出便進(jìn)行下次循環(huán)*/
printf("%c\n", c);
}
}
<goto 語句>
goto語句是一種無條件轉(zhuǎn)移語句, 與BASIC中的goto語句相似。goto 語句的
使用格式為:
goto 標(biāo)號;
其中標(biāo)號是Turbo C2.0中一個(gè)有效的標(biāo)識符, 這個(gè)標(biāo)識符加上一個(gè)":" 一起
出現(xiàn)在函數(shù)內(nèi)某處, 執(zhí)行g(shù)oto語句后, 程序?qū)⑻D(zhuǎn)到該標(biāo)號處并執(zhí)行其后的語句。
另外標(biāo)號必須與goto語句同處于一個(gè)函數(shù)中, 但可以不在一個(gè)循環(huán)層中。通常
goto語句與if條件語句連用, 當(dāng)滿足某一條件時(shí), 程序跳到標(biāo)號處運(yùn)行。
goto語句通常不用, 主要因?yàn)樗鼘⑹钩绦驅(qū)哟尾磺? 且不易讀, 但在多層嵌
套退出時(shí), 用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");
}
作者:
51黑bing
時(shí)間:
2016-3-22 23:21
goto語句
goto語句的發(fā)展歷程
問題起源:
60年代中期以后,計(jì)算機(jī)硬件技術(shù)日益進(jìn)步,計(jì)算的存貯容量、運(yùn)算速度和可靠性明顯提高,生產(chǎn)硬件的成本不斷降低。計(jì)算機(jī)價(jià)格的下跌為它的廣泛應(yīng)用創(chuàng)造了極好的條件。在這種形勢下,迫切要求計(jì)算機(jī)軟件也能與之相適應(yīng)。因而,一些開發(fā)大型軟件系統(tǒng)的要求提了出來。然而軟件技術(shù)的進(jìn)步一直未能滿足形勢發(fā)展的需要,在大型軟件的開發(fā)過程中出現(xiàn)了復(fù)雜程度高、研制周期長、正確性難以保證的三大難題。遇到的問題找不到解決辦法,致使問題堆積起來,形成了人們難以控制的局面,出現(xiàn)了所謂的“軟件危機(jī)”。為了克服這一危機(jī),一方面需要對程序設(shè)計(jì)方法、程序的正確性和軟件的可靠性等問題進(jìn)行系列的研究;另一方面,也需要對軟件的編制、測試、維護(hù)和管理的方法進(jìn)行研究,從而產(chǎn)生了程序設(shè)計(jì)方法學(xué)。
goto語句是有害的觀點(diǎn):
1968年,E·W·代克斯特拉首先提出“GOTO語句是有害的”論點(diǎn),向傳統(tǒng)程序設(shè)計(jì)方法提出了挑戰(zhàn),從而引起了人們對程序設(shè)計(jì)方法討論的普遍重視。
goto語句的爭論:
在60年代末和70年代初,關(guān)于GOTO語句的用法的爭論比較激烈。主張從高級程序語言中去掉GOTO語句的人認(rèn)為,GOTO語句是對程序結(jié)構(gòu)影響最大的一種有害的語句,他們的主要理由是:GOTO語句使程序的靜態(tài)結(jié)構(gòu)和動(dòng)態(tài)結(jié)構(gòu)不一致,從而使程序難以理解,難以查錯(cuò)。去掉GOTO語句后,可直接從程序結(jié)構(gòu)上反映程序運(yùn)行的過程。這樣,不僅使程序結(jié)構(gòu)清晰,便于理解,便于查錯(cuò),而且也有利于程序的正確性證明。
持反對意見的人認(rèn)為,GOTO語句使用起來比較靈活,而且有些情形能提高程序的效率。若完全刪去GOTO語句,有些情形反而會(huì)使程序過于復(fù)雜,增加一些不必要的計(jì)算量。
關(guān)于goto語句的解決方法:
1974年,D·E·克努斯對于GOTO語句爭論作了全面公正的評述,其基本觀點(diǎn)是:不加限制地使用GOTO語句,特別是使用往回跳的GOTO語句,會(huì)使程序結(jié)構(gòu)難于理解,在這種情形,應(yīng)盡量避免使用GOTO語句。但在另外一些情況下,為了提高程序的效率,同時(shí)又不致于破壞程序的良好結(jié)構(gòu),有控制地使用一些GOTO語句也是必要的。用他的話來說就是:“在有些情形,我主張刪掉GOTO語句;在另外一些情形,則主張引進(jìn)GOTO語句。”從此,使這場長達(dá)10年之久的爭論得以平息。
后來,G·加科皮尼和C·波姆從理論上證明了:任何程序都可以用順序、分支和重復(fù)結(jié)構(gòu)表示出來。這個(gè)結(jié)論表明,從高級程序語言中去掉GOTO語句并不影響高級程序語言的編程能力,而且編寫的程序的結(jié)構(gòu)更加清晰。
goto語句的結(jié)果:
在C/C++等高級編程語言中保留了goto語句,但被建議不用或少用。在一些更新的高級編程語言,如Java不提供goto語句,它雖然指定goto作為關(guān)鍵字,但不支持它的使 用,使程序簡潔易讀;盡管如此后來的c#還是支持goto語句的,goto語句一個(gè)好處就是可以保證chengx程序存在唯一的出口,避免了過于龐大的if嵌套。
作者:
51黑bing
時(shí)間:
2016-3-22 23:22
goto語句在C/C++語言中可謂是“臭名昭著”,乃至有的書(或公司的編程規(guī)范)提出禁用goto語句的說法。其結(jié)果就是,造成有的程序員一看到goto語句在某程序中被使用,就本能地認(rèn)為這個(gè)程序?qū)懙煤堋袄薄4送猓彩沟糜行┏绦騿T因?yàn)槭褂昧薵oto語句而覺得自己很不專業(yè)。其實(shí),凡事都不能太偏激,goto語句運(yùn)用得好能大大地簡化程序,以及提高程序的可讀性和可維護(hù)性。在開始示例其好處之前,先用一些統(tǒng)計(jì)數(shù)據(jù)來說明goto語句并沒有因?yàn)椤俺裘阎倍粧仐墸@些統(tǒng)計(jì)數(shù)據(jù)可能并不是百分之百的精確,但很具有說服力。對于操作系統(tǒng),Linux-2.6.21內(nèi)核使用了20,333個(gè)goto語句,VxWorks-6.2則使用了9142個(gè),最后941個(gè)goto語句被運(yùn)用到了rtems-4.9.2中;另外,glibc-2.9庫使用了1750個(gè)goto語句。所有這些統(tǒng)計(jì)數(shù)據(jù)都表明,goto語言并沒有想象的那樣可怕而招到禁用,其關(guān)鍵在于 —— 恰當(dāng)?shù)剡\(yùn)用它。
圖1是一個(gè)沒有采用goto語句編寫的函數(shù),其中存在多處出錯(cuò)處理的代碼,比如113~115行、120~122行和126~129行。采用這種分布式的出錯(cuò)處理,很容易出現(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語句所編寫的另一個(gè)版本,與不采用goto語句的版本相比,程序更加的簡單,且在出錯(cuò)處理的地方大都使用goto語句跳轉(zhuǎn)到程序的末尾進(jìn)行處理。goto語句除了可以用在這里所示例的出錯(cuò)處理中,還可以用在其它的程序邏輯中以簡化程序并提高閱讀性。
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語句時(shí)需要注意以下原則:
1) 不要過份地使用。比如圖2中的60行就沒有采用goto語句跳到程序的最后面,之所以這里不使用goto是為了閱讀方便。因?yàn)槌绦虼藭r(shí)還沒有分配資源,所以直接返回顯得更加的直接了當(dāng)。還有就是,在這個(gè)函數(shù)中如果存在使用goto語句都意味著出錯(cuò)了且需要釋放資源。如果將60行的語句也改為goto就破壞了這個(gè)函數(shù)中使用goto語句的一致性。
2) 不要讓goto語句形成一個(gè)環(huán)。使用goto語句應(yīng)形成一條線,從一點(diǎn)跳到另一點(diǎn)。當(dāng)然,如果goto語句的使用沒有破壞可讀性,那可以適當(dāng)?shù)目紤]打破這一原則。
作者:
51黑bing
時(shí)間:
2016-3-22 23:25
在中斷中使用goto語句:LZ用匯編寫過程序,就應(yīng)該明白
當(dāng)你進(jìn)入中斷服務(wù)程序時(shí),單片機(jī)本身會(huì)備份當(dāng)前程序狀態(tài),中斷部分執(zhí)行完畢后會(huì)用RETI恢復(fù)現(xiàn)場
如果這時(shí)候主程序是在執(zhí)行一個(gè)子程序時(shí)進(jìn)入的中斷,那么中斷執(zhí)行完畢后自然會(huì)繼續(xù)執(zhí)行之前的子程序毫無影響,問題就在這...中斷部分用LJMP之類跳轉(zhuǎn)指令(相當(dāng)于goto),自然是“合法”得跳轉(zhuǎn)到目的地,但之前被執(zhí)行到一半的子程序?qū)?huì)被徹底打斷,程序架構(gòu)一旦沒處理好這部分,出問題也在所難免,比如一個(gè)狀態(tài)機(jī),在狀態(tài)改變時(shí)的那一步被打斷......
這樣的話,要么你在所有不可打斷處關(guān)閉中斷,處理完畢后再打開,但這樣程序可移植性等等都將被破壞
要么用類似如下主循環(huán):
while(1)
{
工作1;
跳轉(zhuǎn)變量檢測;
工作2;
跳轉(zhuǎn)變量檢測;
工作3;
跳轉(zhuǎn)變量檢測;
工作4;
跳轉(zhuǎn)變量檢測;
....
}
這樣看似語句啰嗦不少,但每次大循環(huán)也就犧牲若干個(gè)微秒便可保證響應(yīng)的速度
歡迎光臨 (http://www.zg4o1577.cn/bbs/)
Powered by Discuz! X3.1
主站蜘蛛池模板:
免费激情网站
|
久久精品1
|
欧美日韩精品一区二区
|
成人一区二区三区在线
|
中日韩欧美一级片
|
久久精彩
|
一级片视频免费
|
91麻豆产精品久久久久久夏晴子
|
国产在线精品一区二区三区
|
91免费高清
|
91精品国产综合久久国产大片
|
高清国产午夜精品久久久久久
|
亚洲精品视
|
自拍偷拍3p
|
伊人热久久
|
欧美色性
|
久久国产精品99久久久久
|
黄在线免费观看
|
日韩av在线免费
|
久艹网站
|
一区二区三区免费网站
|
午夜激情影院
|
久久精品免费一区二区
|
在线视频日韩
|
sese视频在线观看
|
一区二区在线
|
视频一区二区在线观看
|
91在线视频一区
|
免费高清av
|
日日摸夜夜添夜夜添精品视频
|
在线一区视频
|
91亚洲精选
|
精品一区二区三区免费毛片
|
国产精品99久久久久久久久久久久
|
天天操综合网
|
日韩欧美在线观看
|
天天操天天干天天爽
|
av看片网站
|
久久久久久一区
|
成人国产精品免费观看
|
中文字幕视频免费
|