搜尋
首頁系統教程Linux為什麼Linux核心大量使用goto,而很多書籍卻不提倡使用?

為什麼Linux核心大量使用goto,而很多書籍卻不提倡使用?

Feb 05, 2024 pm 01:25 PM
linuxlinux教程linux系統linux指令shell腳本overflow嵌入式linux良許linux入門linux學習

關於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();
}

運行結果:

為什麼Linux核心大量使用goto,而很多書籍卻不提倡使用?

從運行結果我們明顯可以知道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!");
}

運行結果:

為什麼Linux核心大量使用goto,而很多書籍卻不提倡使用?

從運行結果我們明顯可以知道,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!");
}

運行結果:

為什麼Linux核心大量使用goto,而很多書籍卻不提倡使用?

從運行結果我們明顯可以知道,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中文網其他相關文章!

陳述
本文轉載於:良许Linux教程网。如有侵權,請聯絡admin@php.cn刪除
為什麼Windows通常用於桌面計算和遊戲?為什麼Windows通常用於桌面計算和遊戲?Apr 27, 2025 am 12:01 AM

Windowsispreferredfordesktopcomputingandgamingdueto:1)ITVASTSOFTSOFTWAREANDGAMELIBRARY,2)用戶友好型和customizableInterface,3)廣泛的hardwarecompatibility,and4)PerformanceOptimizationCapities,demalloPtimizationCapities,DespitesomeSomeSomeSomeSourceOmeSourceOmeSourceource-HeaevyAndupDateupdate-uperated。

Linux軟件的未來:Flatpak和Snap會替換本機桌面應用程序嗎?Linux軟件的未來:Flatpak和Snap會替換本機桌面應用程序嗎?Apr 25, 2025 am 09:10 AM

多年來,Linux軟件分佈依賴於DEB和RPM等本地格式,並深深地根深蒂固。 但是,Flatpak和Snap已經出現,有望成為應用程序包裝的通用方法。 本文考試

Linux和Windows處理設備驅動程序的區別有什麼區別?Linux和Windows處理設備驅動程序的區別有什麼區別?Apr 25, 2025 am 12:13 AM

Linux和Windows在處理設備驅動程序上的差異主要體現在驅動管理的靈活性和開發環境上。 1.Linux採用模塊化設計,驅動可以動態加載和卸載,開發者需深入理解內核機制。 2.Windows依賴微軟生態,驅動需通過WDK開發並簽名認證,開發相對複雜但保證了系統的穩定性和安全性。

比較和對比Linux和Windows的安全模型。比較和對比Linux和Windows的安全模型。Apr 24, 2025 am 12:03 AM

Linux和Windows的安全模型各有優勢。 Linux提供靈活性和可定制性,通過用戶權限、文件系統權限和SELinux/AppArmor實現安全。 Windows則注重用戶友好性,依賴WindowsDefender、UAC、防火牆和BitLocker保障安全。

Linux和Windows之間的硬件兼容性有何不同?Linux和Windows之間的硬件兼容性有何不同?Apr 23, 2025 am 12:15 AM

Linux和Windows在硬件兼容性上不同:Windows有廣泛的驅動程序支持,Linux依賴社區和廠商。解決Linux兼容性問題可通過手動編譯驅動,如克隆RTL8188EU驅動倉庫、編譯和安裝;Windows用戶需管理驅動程序以優化性能。

Linux和Windows之間虛擬化支持有哪些差異?Linux和Windows之間虛擬化支持有哪些差異?Apr 22, 2025 pm 06:09 PM

Linux和Windows在虛擬化支持上的主要區別在於:1)Linux提供KVM和Xen,性能和靈活性突出,適合高定制環境;2)Windows通過Hyper-V支持虛擬化,界面友好,與Microsoft生態系統緊密集成,適合依賴Microsoft軟件的企業。

Linux系統管理員的主要任務是什麼?Linux系統管理員的主要任務是什麼?Apr 19, 2025 am 12:23 AM

Linux系統管理員的主要任務包括系統監控與性能調優、用戶管理、軟件包管理、安全管理與備份、故障排查與解決、性能優化與最佳實踐。 1.使用top、htop等工具監控系統性能,並進行調優。 2.通過useradd等命令管理用戶賬戶和權限。 3.利用apt、yum管理軟件包,確保系統更新和安全。 4.配置防火牆、監控日誌、進行數據備份以確保系統安全。 5.通過日誌分析和工具使用進行故障排查和解決。 6.優化內核參數和應用配置,遵循最佳實踐提升系統性能和穩定性。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

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

熱工具

SublimeText3 Mac版

SublimeText3 Mac版

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

DVWA

DVWA

Damn Vulnerable Web App (DVWA) 是一個PHP/MySQL的Web應用程序,非常容易受到攻擊。它的主要目標是成為安全專業人員在合法環境中測試自己的技能和工具的輔助工具,幫助Web開發人員更好地理解保護網路應用程式的過程,並幫助教師/學生在課堂環境中教授/學習Web應用程式安全性。 DVWA的目標是透過簡單直接的介面練習一些最常見的Web漏洞,難度各不相同。請注意,該軟體中

EditPlus 中文破解版

EditPlus 中文破解版

體積小,語法高亮,不支援程式碼提示功能

SecLists

SecLists

SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。

WebStorm Mac版

WebStorm Mac版

好用的JavaScript開發工具