|
GOTO語(yǔ)句使程序的靜態(tài)結(jié)構(gòu)和動(dòng)態(tài)結(jié)構(gòu)不一致,從而使程序難以理解,難以查錯(cuò)。
有人認(rèn)為GOTO語(yǔ)句使用起來(lái)比較靈活,而且有些情形能提高程序的效率。
1974年,D·E·克努斯對(duì)于GOTO語(yǔ)句爭(zhēng)論作了全面公正的評(píng)述,其基本觀點(diǎn)是:不加限制地使用GOTO語(yǔ)句,特別是使用往回跳的GOTO語(yǔ)句,會(huì)使程序結(jié)構(gòu)難于理解,在這種情形,應(yīng)盡量避免使用GOTO語(yǔ)句。但在另外一些情況下,為了提高程序的效率,同時(shí)又不至于破壞程序的良好結(jié)構(gòu),有控制地使用一些GOTO語(yǔ)句也是必要的。用他的話來(lái)說(shuō)就是:“在有些情形,我主張刪掉GOTO語(yǔ)句;在另外一些情形,則主張引進(jìn)GOTO語(yǔ)句!
后來(lái),G·加科皮尼和C·波姆從理論上證明了:任何程序都可以用順序、分支和重復(fù)結(jié)構(gòu)表示出來(lái)。這個(gè)結(jié)論表明,從高級(jí)程序語(yǔ)言中去掉GOTO語(yǔ)句并不影響高級(jí)程序語(yǔ)言的編程能力,而且編寫(xiě)的程序的結(jié)構(gòu)更加清晰。
goto語(yǔ)句的結(jié)果:在C/C++等高級(jí)編程語(yǔ)言中保留了goto語(yǔ)句,但被建議不用或少用。在一些更新的高級(jí)編程語(yǔ)言,如Java不提供goto語(yǔ)句,它雖然指定goto作為關(guān)鍵字,但不支持它的使 用,使程序簡(jiǎn)潔易讀;盡管如此后來(lái)的c#還是支持goto語(yǔ)句的,goto語(yǔ)句一個(gè)好處就是可以保證程序存在唯一的出口,避免了過(guò)于龐大的if嵌套。
可以考慮使用goto的情形:
1.從多重循環(huán)中直接跳出 ;
2. 出錯(cuò)時(shí)清除資源;
3.可增加程序的清晰度的情況。
不加限制地使用goto:破壞了清晰的程序結(jié)構(gòu),使程序的可讀性變差,甚至成為不可維護(hù)的"面條代碼"。經(jīng)常帶來(lái)錯(cuò)誤或隱患,比如它可能跳過(guò)了某些對(duì)象的構(gòu)造、變量的初始化、重要的計(jì)算等語(yǔ)句。
goto語(yǔ)句問(wèn)題的提出直接推動(dòng)了結(jié)構(gòu)化程序設(shè)計(jì)(structured programming)的思想和程序設(shè)計(jì)方法學(xué)的誕生和發(fā)展。結(jié)構(gòu)化程序設(shè)計(jì)方法引入了工程思想和結(jié)構(gòu)化思想,使大型軟件的開(kāi)發(fā)和編程都得到了極大的改善。結(jié)構(gòu)化程序設(shè)計(jì)方法的主要原則可以概括為自頂向下,逐步求精,模塊化,限制使用goto語(yǔ)句。
下列關(guān)于使用goto語(yǔ)句的原則可以供讀者參考。
1) 使用goto語(yǔ)句只能goto到同一函數(shù)內(nèi),而不能從一個(gè)函數(shù)里goto到另外一個(gè)函數(shù)里。
2)使用goto語(yǔ)句在同一函數(shù)內(nèi)進(jìn)行g(shù)oto時(shí),goto的起點(diǎn)應(yīng)是函數(shù)內(nèi)一段小功能的結(jié)束處,goto的目的label處應(yīng)是函數(shù)內(nèi)另外一段小功能的開(kāi)始處。
3)不能從一段復(fù)雜的執(zhí)行狀態(tài)中的位置goto到另外一個(gè)位置,比如,從多重嵌套的循環(huán)判斷中跳出去就是不允許的。
4)應(yīng)該避免像兩個(gè)方向跳轉(zhuǎn)。這樣最容易導(dǎo)致"面條代碼"。
|
|