為什麼Linux核心大量使用goto,而很多書籍卻不提倡使用?
關於C語言中的goto語句,存在著許多爭議,許多書籍建議要「謹慎使用,甚至避免使用」。但是,在Linux之父Linus的實踐中,他在Linux中廣泛使用了goto語句,這也啟示了我們可以合理地使用這個特性。
正因為有爭議,我們有必要學會使用goto語句。下面來看一些goto語句的基本語法和範例:
一、goto的基本語法
goto語句由兩個部分組成:關鍵字goto和標籤名。標籤的命名規則與變數的命名規則相同。範例:
goto label;
要讓這句語句正常運作,函數也必須包含另一個標為label的語句,該語句以標籤名後緊跟著一個冒號開始,如:
label:printf(“goto here.\n”);
二、goto的例子
左右滑動查看全部程式碼>>>
/* 编译环境:mingw32 gcc6.3.0 */ #include #include /* goto测试 */ void TestGoto(void) { int i; while (1) { for (i = 0; i if (i > 6) { goto label; } printf("%s : i = %d\n", __FUNCTION__, i); } } label: printf("test goto end!"); } int main(void) { TestGoto(); }
運行結果:

從運行結果我們明顯可以知道goto用法,可以跳出多重循環,程式執行過程中遇到goto語句就可以跳到label繼續執行。
值得注意的一點是:goto語句與其跳躍的標籤處必須在同一個函數內。
三、goto與break、continue的差別?
同樣是跳轉語句,goto語句與break、continue語句有什麼差別呢?
實際上,break和continue是goto的特殊形式。使用break與continue的好處是:其名稱已經表明他們的用法。
下面透過程式碼實例看一下break與continue的用法:
1、break測試函數
#使用上面的測試程序,建立一個測試break語句的函數void TestBreak(void);
,如:
左右滑動查看全部程式碼>>>
/* break测试 */ void TestBreak(void) { int i; while (1) { for (i = 0; i if (i > 6) { break; /* 第一个break:跳出for循环 */ } printf("%s : i = %d\n", __FUNCTION__, i); } printf("Now i = %d\n", i); break; /* 第一个break:跳出while循环 */ } printf("test break end!"); }
運行結果:

從運行結果我們明顯可以知道,break可以退出目前迴圈。
在本範例中,第一個break語句退出目前的for迴圈,第二個break語句退出目前的while迴圈。可見,一個break可退出一層迴圈。
所以,根據break與goto的特色知道,如果是跳出很多層循環,使用goto會方便些。
2、continue測試函數
同樣的,建立一個測試continue語句的函數void TestContinue(void);
,如:
左右滑動查看全部程式碼>>>
/* continue测试 */ void TestContinue(void) { int i; for (i = 0; i if (i > 6) { printf("i = %d, continue next loop\n", i); continue; /* continue:结束本次循环(而不是终止这一层循环)继续进入下一次循环 */ } printf("%s : i = %d\n", __FUNCTION__, i); } printf("test break end!"); }
運行結果:

從運行結果我們明顯可以知道,continue可以結束本次循環(而不是整個循環)而進入下一個循環(i所代表的就是循環的次數)。
四、支持与反对goto的理由是什么?
1、不提倡使用goto
不提倡使用goto的占比应该比较多,不提倡的原因主要是:很容易把逻辑弄乱且难以理解。
2、使用goto的理由
这一部分人认为goto可以用在以下两种情况比较方便:
(1)跳出多层循环。
这个例子就类似于我们上面的goto测试程序。
(2)异常处理。
一个函数的执行过程可能会产生很多种情况异常情况。下面有几种处理方式,以代码为例:
方法一:做出判断后,如果条件出错,直接return。
*左右滑动查看全部代码>>>*
int mystrlen(char *str) { int count = 0; if (str == NULL) { return-1; } if (*str == 0) { return0; } while(*str != 0 ) { count++; str++; } return count; }
方法二:先设置一个变量,对变量赋值,只有一个return。
*左右滑动查看全部代码>>>*
int mystrlen(char *str) { int ret; if (str == NULL) { ret = -1; } elseif (*str == 0) { ret = 0; } else { ret = 0; while(*str != 0 ) { ret++; str++; } } return ret; }
方法三:使用goto语句。
*左右滑动查看全部代码>>>*
int mystrlen(char *str) { int ret; if (str == NULL) { ret = -1; goto _RET; } if (*str == 0) { ret = 0; goto _RET; } while(*str !=0 ) { ret++; str++; } _RET: return ret; }
其中,方法三就是很多人都提倡的方式。统一用goto err跳转是最方便且效率最高的,从反汇编语句条数可以看出指令用的最少,消耗的寄存器也最少,效率无疑是最高的。
并且,使用goto可以使程序变得更加可扩展。当程序需要在错误处理时释放资源时,统一到goto处理最方便。这也是为什么很多大型项目,开源项目,包括Linux,都会大量的出现goto来处理错误!
以上是為什麼Linux核心大量使用goto,而很多書籍卻不提倡使用?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

Linux系統的五個基本組件是:1.內核,2.系統庫,3.系統實用程序,4.圖形用戶界面,5.應用程序。內核管理硬件資源,系統庫提供預編譯函數,系統實用程序用於系統管理,GUI提供可視化交互,應用程序利用這些組件實現功能。

要查看 Git 倉庫地址,請執行以下步驟:1. 打開命令行並導航到倉庫目錄;2. 運行 "git remote -v" 命令;3. 查看輸出中的倉庫名稱及其相應的地址。

雖然 Notepad 無法直接運行 Java 代碼,但可以通過借助其他工具實現:使用命令行編譯器 (javac) 編譯代碼,生成字節碼文件 (filename.class)。使用 Java 解釋器 (java) 解釋字節碼,執行代碼並輸出結果。

在 Sublime 中運行代碼的方法有六種:通過熱鍵、菜單、構建系統、命令行、設置默認構建系統和自定義構建命令,並可通過右鍵單擊項目/文件運行單個文件/項目,構建系統可用性取決於 Sublime Text 的安裝情況。

要安裝 Laravel,需依序進行以下步驟:安裝 Composer(適用於 macOS/Linux 和 Windows)安裝 Laravel 安裝器創建新項目啟動服務訪問應用程序(網址:http://127.0.0.1:8000)設置數據庫連接(如果需要)

Linux的主要用途包括:1.服務器操作系統,2.嵌入式系統,3.桌面操作系統,4.開發和測試環境。 Linux在這些領域表現出色,提供了穩定性、安全性和高效的開發工具。

Visual Studio Code (VSCode) 是一款跨平台、開源且免費的代碼編輯器,由微軟開發。它以輕量、可擴展性和對眾多編程語言的支持而著稱。要安裝 VSCode,請訪問官方網站下載並運行安裝程序。使用 VSCode 時,可以創建新項目、編輯代碼、調試代碼、導航項目、擴展 VSCode 和管理設置。 VSCode 適用於 Windows、macOS 和 Linux,支持多種編程語言,並通過 Marketplace 提供各種擴展。它的優勢包括輕量、可擴展性、廣泛的語言支持、豐富的功能和版
