c語言為什麼不能用goto寫迴圈

2022-03-07 11:29:01 字數 5683 閱讀 7578

1樓:匿名使用者

當然是可以的,你沒有用但編譯生成的組合語言中會用到。

for ( i=0;i<10;i++ ) x++;可以寫成i=0;

loop:

if ( i<10 )

只不過後一種寫法不利於讀懂程式,兩者在彙編層次上是差不多滴

2樓:匿名使用者

限制使用goto是結構化程式設計的原則之一,goto過多會使程式混亂,流程不清

3樓:匿名使用者

goto是一個有爭議的語句,許多書本建議少用或不用它,是因為它是無條件跳轉目標,不符合結構化程式設計的思想,還有就是從程式書寫規範和易讀角度說,經常使用goto語句會使**混亂(你沒事跳轉來跳轉去 ,會搞得整個程式,只有你自己看得懂,也許跳個十幾次之後,你自己也會看不懂)。

goto語句不是不可以用,是不可濫用,要慎用。goto至少有一處可顯神通,它能從多重迴圈中咻地一下子跳到外面,……就像房子著火了,來不及從樓梯一級一級往下走,可從視窗跳出火坑。……」(《高質量c++/c程式設計指南》第32頁)

goto只是簡單的跳轉語句,並沒有錯,但跳轉之前可以做限定 ,if & goto 這兩個可以一起用,但儘量是少用,如果避免過多的巢狀迴圈,可以使用break和continue來完成迴圈退出 。

goto的目標是一個標號,這個標號的起名倒有點意思,因為標號只用於goto,所以它的名字可以與任何變數名以及其它識別符號一樣而不產生重名。以前的程式是帶行號的,所以就「goto 行號」,現在程式不帶行號了,但是允許在任何地方加標號。編譯器在碰到它們的時候,大概就是憑其後頭的冒號來判斷這個名字不需要檢驗合法性。

下面舉例說明:

#include

void main()

printf( "\n" );

/*這個迴圈輸出1 2 3 4 6 7*/

for ( m = 1; m <= 10; m ++ )

printf(" %d",m);

}printf ("end");

ret:

return;}

4樓:

最根本原因是,goto是無條件直接跳轉,這樣當程式複雜時**條理就極易混亂!

5樓:匿名使用者

可以用,只不過不推薦使用,因為比較容易造成流程不清

6樓:匿名使用者

並不是說不能用,而是儘量避免不要用,會破壞c語言的結構,而且可能使程式顯得比較亂

7樓:匿名使用者

goto是跳轉語句!不是迴圈語句

8樓:匿名使用者

不是不能用,而是它會破壞c語言的結構化程式設計思想。

9樓:匿名使用者

當然可以用,說的只是別濫用罷了。

為什麼不贊成使用goto語句(c語言)

10樓:風若遠去何人留

c語言是程序導向的語言,在程式設計的時候,一般會遵從結構化程式設計的要求。

結構化程式設計要求模組單入口,單出口,而goto語句則容易破壞這種結構,所以不建議使用。

但這並不是強制的,只是一種建議,有時goto可以大幅度簡化**量,在保證**足夠清晰明確下,偶爾使用也是可以的。

以下為結構化程式設計的相關概念:

最早由e.w.dijikstra在2023年提出的,是軟體發展的一個重要的里程碑。

它的主要觀點是採用自頂向下、逐步求精及模組化的程式設計方法;使用三種基本控制結構構造程式,任何程式都可由順序、選擇、迴圈三種基本控制結構構造。結構化程式設計主要強調的是程式的易讀性。

結構化程式設計曾被稱為軟體發展中的第三個里程碑。該方法的要點是:

(1) 主張使用順序、選擇、迴圈三種基本結構來巢狀連結成具有複雜層次的「結構化程式」,嚴格控制goto語句的使用。用這樣的方法編出的程式在結構上具有以下效果:

a. 以控制結構為單位,只有一個入口,一個出口,所以能獨立地理解這一部分。

b. 能夠以控制結構為單位,從上到下順序地閱讀程式文字。

c.由於程式的靜態描述與執行時的控制流程容易對應,所以能夠方便正確地理解程式的動作。

(2)「自頂而下,逐步求精」的設計思想,其出發點是從問題的總體目標開始,抽象低層的細節,先專心構造高層的結構,然後再一層一層地分解和細化。這使設計者能把握主題,高屋建瓴,避免一開始就陷入複雜的細節中,使複雜的設計過程變得簡單明瞭,過程的結果也容易做到正確可靠。

(3)「獨立功能,單出、入口」的模組結構,減少模組的相互聯絡使模組可作為外掛或積木使用,降低程式的複雜性,提高可靠性。程式編寫時,所有模組的功能通過相應的子程式(函式或過程)的**來實現。程式的主體是子程式層次庫,它與功能模組的抽象層次相對應,編碼原則使得程式流程簡潔、清晰,增強可讀性。

(4) 主程式設計師組。

其中(1)、(2)是解決程式結構規範化問題;(3)是解決將大劃小,將難化簡的求解方法問題;(4)是解決軟體開發的人員組織結構問題。

11樓:匿名使用者

使用goto編寫的程式邏輯性差,可讀性差

不過在退出多重迴圈的時候 建議使用

12樓:

降低效率,降低可讀性,破壞程式結構化

一般goto用來跳出多級迴圈

13樓:匿名使用者

達不到現在所贊成使用的"結構化".

如果**多了,跳來跳去感覺很亂,個人認為

14樓:匿名使用者

goto語句會破壞「結構化」。

不但帶來程式設計的混亂,而且容易出錯。

打個比方,比如你生產一個機器,你會希望零件之間不要發生太緊密的聯絡,一般用螺絲之類的來連線。如果你把兩個零件用電焊焊死,那麼一旦一個零件出錯,另一個也會受到影響。

goto起的作用就像把零件焊死一樣。如果程式某一部分因為某種原因必須改動,可能會導致整個程式產生巨大的修改工作量。

c語言中,我覺得goto語句很好用啊,在做一些判斷時很實用,但為什麼書上說寧願加強迴圈也不用goto語句?

15樓:風若遠去何人留

goto語句也稱為無條件轉移語句,在結構化程式設計中一般不主張使用goto語句, 以免造成程式流程的混亂,使理解和除錯程式都產生困難。

2023年,edsger wybe dijkstra 首先提出「goto語句是有害的」論點,向傳統程式設計方法提出了挑戰,從而引起了人們對程式設計方法討論的普遍重視。

主要理由是:goto語句使程式的靜態結構和動態結構不一致,從而使程式難以理解,難以查錯。去掉goto語句後,可直接從程式結構上反映程式執行的過程。

這樣,不僅使程式結構清晰,便於理解,便於查錯,而且也有利於程式的正確性證明。

後來從理論上證明了:任何程式都可以用順序、分支和重複結構表示出來。這個結論表明,從高階程式語言中去掉goto語句並不影響高階程式語言的程式設計能力,而且編寫的程式的結構更加清晰。

所以目前是不推薦使用goto的。

16樓:匿名使用者

goto用起來是方便,但是破壞了程式的結構,你寫的時候可能很明白,但對以後的維護、其它人員的接手都是破壞性的。一個良好的程式結構,比效率都重要,對一個產品來說,可維護性的重要性是很高的,而goto語句正是這方面的大敵。

17樓:

可能是因為goto跳轉的話,跳來跳去,最後會導致程式很難測試,如果出了問題,很難找吧。

18樓:匿名使用者

在簡單的**中用goto語句沒什麼關係,但是在複雜的語句中,容易造成記憶體洩露,或者造成迴圈出錯。

19樓:匿名使用者

goto太牛了,可以轉到任何位置,用太多,不利於程式閱讀,有時還會出現死迴圈,

20樓:匿名使用者

goto的侷限性問題,goto不能從一個函式跳到另一個函式

21樓:匿名使用者

用多了自己都就會蒙圈。goto是破壞程式結構的殺手。

22樓:栩箭

俗話說,盡信書,不如無書。

少用goto,不過目前很多人會在多重迴圈之中遇到錯誤之類的時候,直接用goto跳到外層在做釋放資源並返回的行為。

ps,還有直接用setjmp等直接在函式間跳轉的來著。

23樓:匿名使用者

事情都沒有絕對的.

一般來說,在沒有養成良好的程式設計習慣前,goto語句一般應儘量避免使用。

不提倡用goto語句,並不代表goto語句無用或說goto語句有害。

該用goto時就用,不必被規矩束縛,關鍵是程式條理清晰,容易讀懂。

24樓:weida愛問

1、為什麼不用goto??原因在於,goto語句會導致源**很難看懂,如果程式設計者在程式中大量使用goto跳轉語句,可讀性可能會大大減低!

2、什麼時候可以用goto??其實一般來說,任何時候都可以!因為這並無語法錯誤。

但嚴格來說,一般在多重迴圈的內迴圈中要跳出時,可用!或者在錯誤處理時可用!linux核心就大量這樣使用!

c語言中goto語句的用法??舉例來說。

25樓:飛喵某

1、c語言中goto又叫無條件轉移語句,可以讓程式直接跳轉到任意標記的位置。用法就是「goto label……label:」。

下面用一個示例來演示具體的用法,這裡先新建一個c語言的程式檔案,演示使用的是visual studio軟體作為開發工具:

2、輸入goto語句應用**,這裡先定義兩個變數a和b,然後用printf函式列印兩句話,直接用goto語句強制跳轉到列印b語句的end標記位置,此時a的列印就不會執行了:

3、編譯執行程式,按下crtl+f5開啟命令列,就可以看到執行的結果,列印出了b語句,和預期的結果一樣。以上就是c語言中goto的用法:

26樓:哇哎西西

goto語句可以使程式在沒有任何條件的情況下跳轉到指定的位置,所以goto語句又被稱為是無條件跳轉語句。

它的語法如下

goto label;

//其它**

label:

其中,label為我們自己定義的一個標籤,定義的規則與變數的命名相同,它的位置是不固定的,它可以寫在goto語句的後面,也可以寫在它的前面,然而goto語句只能在一個函式內部跳轉,它並不允許跳轉出一個函式外部。

int day = 1;

loop:

if (day <= 31)

上面程式就是利用了goto和if語句來實現了迴圈功能,它與while實現的迴圈功能一樣,其中loop為我們定義的一個label(標籤)。

27樓:匿名使用者

用法如下:

goto語句也稱為無條件轉移語句,其一般格式如下:

goto 語句標

號; 其中語句標號是按識別符號規定書寫的符號, 放在某一語句行的前面,標號後加冒號(:)。語句標號起標識語句的作用,與goto 語句配合使用。

例子: label: i++;

loop: while(x<7);

c語言不限制程式中使用標號的次數,但各標號不得重名。goto語句的語義是改變程式流向, 轉去執行語句標號所標識的語句。

goto語句通常與條件語句配合使用。可用來實現條件轉移, 構成迴圈,跳出迴圈體等功能。

但是,在結構化程式設計中一般不主張使用goto語句, 以免造成程式流程的混亂,使理解和除錯程式都產生困難。

c語言scanf輸入時為什麼不能用逗號隔開

c語言scanf輸入時能用逗號隔開,但是輸入資料的時候一定也要加上逗號。用scanf 讀取資料時,輸入的格式必須和scanf 的格式控制字串對應。對於標準輸入函式scanf來說,括號內的格式字串,也就是由 中的部分,除了 引導的格式字元之外,所有的其他字元必須在輸入資料時原樣原位置輸入。例如 sca...

C語言中gets函式輸入字串,不能放在迴圈中重複輸入

include include int main return 0 scanf輸入後那個回車被gets str 接收了內,所以下次容 遇到gets就不再等待你輸入,可以用getchar 把scanf輸入後的回車接收就好了。我執行過的,給最佳答案哦!每次使用了輸入輸出函式後,可以直接使用 fflush...

c語言為什麼微控制器中斷中不能用跳轉

在中斷子函式中是不能用跳轉語句跳轉回主程式的,而是中斷子函式執行完了,自己返回到斷點的,只有自己返回到斷點處,才能恢復中斷狀態,幷包括恢復堆疊,否則就會出現中斷混亂,而用多次中斷後堆疊溢位了。通俗點bai講吧,中斷就是一個 du 插隊者,也就是zhi 你插隊也就dao行了,你現在 還搞得 拉一幫小弟...