找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 2830|回復(fù): 16
打印 上一主題 下一主題
收起左側(cè)

求教:C語(yǔ)言這樣編程可以嗎?

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:610895 發(fā)表于 2019-9-12 21:19 來(lái)自手機(jī) | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
單片機(jī)開(kāi)機(jī)顯示函數(shù)最后一句是while(1);想要繼續(xù)執(zhí)行按鍵程序,可以這樣編寫(xiě)嗎?
while(1){
                       if(k1==0)//kn是獨(dú)立按鍵
                       goto loop1
                       else if(k2==0)
                       goto loop2
                               ……
                        

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

使用道具 舉報(bào)

沙發(fā)
ID:94031 發(fā)表于 2019-9-13 09:17 | 只看該作者
goto loop1改成函數(shù)直接調(diào)用不行嗎?xxxx();
回復(fù)

使用道具 舉報(bào)

板凳
ID:282850 發(fā)表于 2019-9-13 09:57 | 只看該作者
goto似乎用起來(lái)很方便,但實(shí)際上不好用,所以goto是不建議C中使用的。從你的不確定,也說(shuō)明自己不好把控goto。
C可以自信地說(shuō),不需要goto,不管按鍵,其它任何復(fù)雜的功能都能實(shí)現(xiàn)。
回復(fù)

使用道具 舉報(bào)

地板
ID:47286 發(fā)表于 2019-9-13 11:12 | 只看該作者
f556 發(fā)表于 2019-9-13 09:57
goto似乎用起來(lái)很方便,但實(shí)際上不好用,所以goto是不建議C中使用的。從你的不確定,也說(shuō)明自己不好把控got ...

搭車問(wèn)下 看好多地方都說(shuō)盡量不用goto 它哪不好啊
回復(fù)

使用道具 舉報(bào)

5#
ID:155507 發(fā)表于 2019-9-13 23:05 | 只看該作者
因?yàn)槔鲜纸?jīng)過(guò)寫(xiě)很多代碼發(fā)現(xiàn),同一個(gè)程序隨著goto語(yǔ)句的使用次數(shù)增多,它的邏輯就會(huì)成指數(shù)上升,人腦是看不懂它的邏輯,哪怕前一秒是自己寫(xiě)的,后一秒就不知它跑哪去了。當(dāng)然你在一個(gè)程序用一個(gè)兩個(gè)還是可以的(別聽(tīng)書(shū)上瞎說(shuō),其實(shí)我認(rèn)為你偶爾做書(shū)上不建議的事也許會(huì)有意想不到的收獲),挺方便的(但注意,要自己控制goto數(shù)量,多了你會(huì)后悔的)。

回復(fù)

使用道具 舉報(bào)

6#
ID:610895 發(fā)表于 2019-9-14 07:02 來(lái)自手機(jī) | 只看該作者
f556 發(fā)表于 2019-9-13 09:57
goto似乎用起來(lái)很方便,但實(shí)際上不好用,所以goto是不建議C中使用的。從你的不確定,也說(shuō)明自己不好把控got ...

是,程序按現(xiàn)在的想法編寫(xiě)至少有11個(gè)goto語(yǔ)句,所以有點(diǎn)怕出錯(cuò)。其實(shí)我主要問(wèn)的是while(1);這個(gè)死循環(huán)這么改行不行?
回復(fù)

使用道具 舉報(bào)

7#
ID:155507 發(fā)表于 2019-9-14 08:39 | 只看該作者
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)致"面條代碼"。

回復(fù)

使用道具 舉報(bào)

8#
ID:155507 發(fā)表于 2019-9-14 13:07 | 只看該作者
夜遇 發(fā)表于 2019-9-14 07:02
是,程序按現(xiàn)在的想法編寫(xiě)至少有11個(gè)goto語(yǔ)句,所以有點(diǎn)怕出錯(cuò)。其實(shí)我主要問(wèn)的是while(1);這個(gè)死循環(huán) ...

簡(jiǎn)單的回答是不行,使用goto語(yǔ)句只能goto到同一函數(shù)內(nèi),而不能從一個(gè)函數(shù)里goto到另外一個(gè)函數(shù)里。
回復(fù)

使用道具 舉報(bào)

9#
ID:462827 發(fā)表于 2019-9-14 23:23 | 只看該作者
盡量不用goto,你想要的功能也照樣能寫(xiě)出來(lái)。
回復(fù)

使用道具 舉報(bào)

10#
ID:123289 發(fā)表于 2019-9-15 10:26 | 只看該作者
事物有其兩面性,如果GOTO一無(wú)是處就沒(méi)有存在的價(jià)值了。
回復(fù)

使用道具 舉報(bào)

11#
ID:600906 發(fā)表于 2019-9-15 11:18 | 只看該作者
不建議用goto語(yǔ)句,可以改為函數(shù)調(diào)用,這樣是代碼更加高效化
回復(fù)

使用道具 舉報(bào)

12#
ID:592807 發(fā)表于 2019-9-15 17:49 | 只看該作者
dzbj 發(fā)表于 2019-9-13 11:12
搭車問(wèn)下 看好多地方都說(shuō)盡量不用goto 它哪不好啊

容易發(fā)生一些變量未定義的錯(cuò)誤或者重復(fù)定義胡錯(cuò)誤,如下a未定義
goto  a1;
int a=1;
a1:
a++;
回復(fù)

使用道具 舉報(bào)

13#
ID:611768 發(fā)表于 2019-9-15 19:51 | 只看該作者
goto在運(yùn)行過(guò)程當(dāng)中可能不是很穩(wěn)定,建議不要用goto吧
回復(fù)

使用道具 舉報(bào)

14#
ID:383084 發(fā)表于 2019-9-15 20:12 | 只看該作者
使用起來(lái)是沒(méi)什么問(wèn)題,但可以把goto換成要執(zhí)行的函數(shù)啊,goto使用多了程序的執(zhí)行不好把控
回復(fù)

使用道具 舉報(bào)

15#
ID:519162 發(fā)表于 2019-9-15 20:33 | 只看該作者
盡量別用GOTO這個(gè)
回復(fù)

使用道具 舉報(bào)

16#
ID:611801 發(fā)表于 2019-9-15 21:02 | 只看該作者
強(qiáng)烈建議不要用goto,C語(yǔ)言goto其實(shí)差點(diǎn)被刪掉了...除非C用了很長(zhǎng)時(shí)間了,否則不要這個(gè)語(yǔ)句...你這個(gè)肯定可以用函數(shù)調(diào)用的方式寫(xiě),比這個(gè)更易懂
回復(fù)

使用道具 舉報(bào)

17#
ID:611890 發(fā)表于 2019-9-16 09:28 | 只看該作者
我覺(jué)得可以這樣寫(xiě),但是要加一個(gè)else return ;這樣可以避免因?yàn)闆](méi)有考慮全某種情況而造成死循環(huán)
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

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

快速回復(fù) 返回頂部 返回列表