為什麼在組合語言中需大量使用跳轉指令,而在C語言中卻盡量避免使用goto語句呢?

時間 2021-05-06 17:27:42

1樓:

因為組合語言是低階語言,早期的組合語言根本就是機器指令的助記符,並不支援結構化程式設計,沒有if、else這些東西,所有的分支都是靠跳轉或條件跳轉來實現。。。後期雖然有了巨集彙編,有IF巨集、ELSE巨集這些用了,但是巨集彙編使用起來還是不方便,還有不少問題。。。

C語言就不同了,作為幾乎是最早一批的高階語言,if、else這些分支語句早早就支援了,雖然還保留了goto語句,但那也是早期為了照顧習慣了直接跳轉的程式設計師。。。加上後來結構化程式設計思想的興起,所以大家就都不建議使用goto了。。。

2樓:

高一學生,自學的。勿噴。。。

1.MASM高版本是加入了高階語法的。

.if.elseif

.endif

如果按照跳轉指令的來

jxx s1

jmp s2

不說別的,標號命名就是問題,雖然引入了@@,可是,這玩意找個跳轉目的能找半天。

2.高階語言裡面為什麼要用goto啊?打亂節奏。

3樓:暮無井見鈴

彙編是不得不用。

goto 的主要問題是很容易破壞結構化程式設計。不過其實 goto 也有可用於結構化的地方:限定為向外層、向後跳。

可惜 C/C++ 沒有做這種帶診斷的 goto 。

4樓:AutherM

因為C語言是對彙編指令集的乙個更加高階的抽象。當然抽象是為了更好用,更易用,更不容易出錯。C語言的條件,迴圈語句已經是很好的了,幹嘛還要用容易出錯的goto

5樓:

C語言作為組合語言的抽象

提供的是乙個結構完整性的邏輯封裝

大部分語言寫的流程就只有固定兩種——分支和迴圈用彙編來寫也是一樣

因此沒必要直接使用goto

況且這樣還直接降低可讀性(

懂了吧分支和迴圈結構在彙編中也是靠花式jmp實現的

6樓:APPLE

高階語言裡面的if else,for,while等等流程控制語句,翻譯到彙編,還不都是jmp,jnz等跳轉指令啊。

用高階語言的目的,就是不想讓人手寫調整啊,讓人用可讀性更高的控制語句來寫,讓編譯器給你處理成底層的跳轉指令。

既然這樣,不是非常必要的情況下何必還要用goto?

7樓:郭氏

c和彙編的程式設計思維不一樣的,彙編要求各種跳,那是因為沒有if沒辦法,要是你用彙編的思路寫c,你一樣可以把goto玩的很6

8樓:Colin

核心裡好多goto 甚至有誇函式的我也沒看有人說啥 goto是個好東西但是很看使用的人

ps 2.6.24核心更高版本的不知道寫成什麼樣子

9樓:如斯

在彙編裡面不要跳轉指令沒其他指令可用。是不得不用。C裡面有各種條件語句,不用跳轉語句可以實現所有邏輯,而且絕大多數情況下實現的更好。

但是,如果是函式中有多個資源需要釋放,又存在多處返回的時候,不用goto語句反而會處理的的不好。所以,在C裡面應該僅僅這一中場景下用goto,而且還只能往後跳轉。

10樓:大熊哥哥

高階語言中Goto語句破壞了程式的結構性和可讀性彙編是計算機實際執行的邏輯,程式不可避免(也是必須)有流程之間的分支與跳轉,都必須要跳轉指令實現。。沒有跳轉,分支與迴圈怎麼做??

高階語言是面向人,要保證可讀性,並且高階語言提供了語法和關鍵字將goto 包裝成可讀性更高的迴圈 if…else switch 以及內聯函式等等。。沒有必要直接去使用goto。。

組合語言就是計算機實際指令序列。沒有跳轉指令就沒有迴圈和分支。。很多程式根本就沒法寫出來。。

問出這樣的問題,你會程式設計嗎??????

11樓:夜月

沒有被邀,搶答一發,有不對的請指正。

組合語言中的JMP指令才等於GOTO語句,而JNZ與JE之類的指令,平時是與CMP指令搭配使用,等同於C語言的if...else...語句,所以,goto語句只等於JMP指令,不等於條件跳轉指令。

而通常的條件跳轉指令跳轉的子程式都是有ret指令的。

12樓:

在彙編裡面,只有goto可以用,沒有其他的方法代替。

而在c裡面有很多種方式來代替goto。

為啥弄出來這麼多的方式呢?就是為了避免goto帶來的麻煩。

13樓:賀超

goto明顯是乙個特權指令,在乙個系統中偶爾用一下可以說是神來之筆,但是特權太多就會產生混亂的根源。所以最好還是能不用還是不用了吧。

14樓:

對於硬體商來說,實現計算機可用的最基本流程控制最少需要幾條流程控制指令?1條,jmp。

而對於高階語言裡的各種流程控制相關的語句if,for,switch,while等等(包括使用這些玩意組合出來的更複雜的流程控制),最終都可以通過jmp來實現。

這是基本的數學原理(參考圖靈機)和成本考慮。「能用即可」是機器製造的普遍目標。

如同你不會去想著把所有運算都用數值方法表達為只含有的+-*/的多項式運算,再把+-*/都轉化成二進位制的與或運算來進行計算一樣雖然數學告訴你這麼做是可以的,你的數學能力牛批的話,這樣做說不定還能運算的更快。

c語言往後的「高階語言」也一樣,為了降低門檻和上手難度,以及使用中出現錯誤的概率。

提供意思更明確,行為更可控的流程控制語句,有著更好用的用途。

即便到目前為止還沒有學科能徹底的解釋清楚,」更適合人類閱讀/理解/使用「具體是個什麼情況,但是根據幾十年的工程經驗教訓,少用goto就對了。但也不能排除就有那麼些個千百年難一遇的武學奇才,就喜歡更」純粹「一點的goto呢。

15樓:詩酒趁年華

組合語言脫胎於機器語言,其本質就是二進位制機器指令的語義化替換,所以機器語言是咋樣,它自然也是咋樣,該跳跳。

高階語言則是組合語言/機器語言的封裝。其目的正是把苦命的碼農從跳來跳去的暫存器和記憶體中解放出來,投入條件判斷語句的懷抱。所以你的什麼 if else case 迴圈說白了都是各種跳轉的封裝

所以你為什麼非要開歷史的倒車呢?/笑

16樓:

在SICP中, 這樣做的原因是抽象分層.

每乙個抽象層只呼叫自己的下層所提供的函式, 不能跨級呼叫打個比方, 乙個人只能控制自己的骨骼肌, 不能暫停自己的心跳, 不能控制腸胃蠕動, 也不能控制激素分泌, 因為這些這些植物神經系統的控制功能並沒有提供給大腦, 再往下一層, 人體血細胞或免疫細胞的行為也不受所有神經系統控制,它們的控制函式並未提供給神經系統.

在程式語言中,底層的彙編跳轉函式只提供給自己的上層--編譯器, 編譯器則在此基礎上提供分支和迴圈及函式呼叫給程式設計師, 而跨越抽象層來呼叫只會導致混亂.

之前看過乙個趣聞, 科學家用小鼠做實驗, 連線個乙個電極到鼠腦的快樂中樞, 只要小鼠一按槓桿, 就會感到快樂, 結果小鼠很快就把自己按死了. 和吸毒一樣, 跨越控制層級發號施令是沒有好下場的...

17樓:

每次我遇到有人無腦噴goto的時候, 我都會祭出這幾條語句

18樓:

大量跳轉的場合下,我用switch-case機制的狀態機實現跳轉。每乙個case值,用enum定義成容易識別的常量,於是,case值就相當於語句塊的標號。在每乙個case中,最多寫三層if-else。

當然,乙個case中,也可以只寫一層if-else。狀態機的好處是,跳轉路徑清晰。壞處是,程式長。

不過,我不擔心效率。因為,我堅信,編譯器可以可以優化得很好。

19樓:禽牙

break和continue是不是跳轉,for迴圈都執行到下一條語句了,又返回來再執行上一條,這都往回跳了。

不一定非得叫goto才goto嘛,臥龍諸葛亮漢丞相這都乙個銀。

盡量避免只是給初學者建議,就跟電器上寫的內有高壓,嚴禁開啟一樣,你要跟售後師傅一樣懂,隨便開,但要是不懂,就容易被電。

20樓:「已登出」

可以用啊,跳出多種迴圈的時候你有什麼更好的選擇麼,但是不能亂跳就是了...

還有就是去看Linux原始碼的話,你會發現也是有很多goto,但是並不影響什麼。

21樓:

因為機器就是只有goto,沒有for while 等邏輯跳轉方式

在高階語言中迴圈,條件都是對機器goto的封裝

為了防止一些水平不夠的程式設計師到處胡亂使用goto,所以高階語言一般不建議使用goto

22樓:LoveCandy

本質上是語言所處的層次不同,抽象程度也不同的問題。goto是彙編層語言的抽象,符合彙編層的思維習慣。而C作為高階語言,應該利用分支和迴圈兩種抽象來處理邏輯。

不同層級的抽象混合使用會增加無謂的複雜度。

但凡事無絕對。在沒有try catch的情況下,想要把異常情況的邏輯梳理好,還真得靠goto。你用函式去處理異常會瘋的,因為這個邏輯幾乎無法復用而且有非常多的上下文引數。

你會發現,在linux核心裡goto基本都是用來做異常處理的。

23樓:

組合語言是給機器看的,機器碼1比1的翻譯,機器碼本來就是跳來跳去的,迴圈、分支都是跳轉。

而 C 語言其實是給人讀的,因此 C 語言中應該盡量避免這種影響人閱讀的直接跳轉,而使用迴圈等方式,以降低維護成本。

24樓:

跳轉對於機器來說是非常自然非常高效的操作,不容易被別的替代。所以機器語言中沒聽說取消跳轉的。

結構化程式設計中,各種語言結構已經包含了跳轉的效果,不再必需goto語句。c語言作為一種結構化程式設計的語言,當然就不推薦多用goto語句了。

25樓:NJU好源氏

因為程式設計師用goto會造成邏輯混亂,而編譯生成的彙編檔案容易和機器碼進行對應,而機器執行跳轉來進行迴圈會很方便,而且編譯器生成的迴圈肯定是沒錯的

26樓:我的姓我的名

我不知道沒有GOTO語句的高階語言程式機器碼反彙編以後是否有類似的GOTO語句。

其實組合語言也要儘量減少無條件跳轉,並且避免跳轉範圍太大。

27樓:S0UVEN1R

不是彙編需要使用大量的類似goto的跳轉指令,而是彙編只提供了類似goto的指令來完成分支和迴圈結構。而C語言給了你更好用的if,while,for來提高可讀性並且能代替絕大部分彙編的跳轉指令,為什麼不用呢?

初學者容易濫用goto導致各種問題,所以教程中就乾脆不建議用了。

一般只有以下兩種情況使用goto比較好:

1、跳出多層迴圈;

2、需要類似try catch final的結構時。

組合語言中的 向C進製 c是什麼意思?

孟桓慶 Status Flags The status flags reflect the outcomes of arithmetic and logical operations performed by the CPU.The carry flag CF is set when the res...

為什麼組合語言不能越過作業系統操控硬體?

問題就是錯的。組合語言能直接操控硬體。bios 早期由彙編寫成,不能操控硬體嗎?pc 最早的作業系統是 dos,核心是組合語言寫成,不能操控硬體嗎?8086 和 dos 對許可權管理幾乎沒有,早期極客繞過 dos 操作硬體是家常便飯。windows 系統之後,系統啟動就不再給您這個機會,但驅動程式之...

計算機的組合語言為什麼沒有中文的版本

裝風的小龍 什麼語言的版本都可以,這只是乙個編碼問題,最終翻譯完了以後交給CPU之類的晶元執行的還是代表0 1的電訊號。其實人們一開始程式設計的時候是用的紙帶 Punched tape Wikipedia 使用的乙個著名的編碼方案是ASCII,如果你要用中文程式設計的話,現在應該用utf 8之類的u...