C語言---goto語句

文章目錄

  • 基本語法
  • 代碼示例
  • goto 的常見用途(盡管不推薦)
  • 為什么 goto 聲名狼藉?(goto的缺點)
  • 如何避免使用 goto?(替代方案)

goto 語句是一種無條件跳轉語句,它用于將程序的控制流無條件地轉移到同一函數內的某個指定標簽(Label)處。
它的存在歷史悠久,在早期的結構化編程語言中很常見,但在現代編程實踐中,由于其可能帶來的問題,通常不建議使用。

基本語法

goto 語句包含兩個部分:
1、goto 關鍵字后跟一個標簽名。
2、一個標簽定義,由標簽名后跟一個冒號 : 組成。

goto label; // 跳轉到標簽處// ... 其他代碼 ...label: // 標簽定義// 要執行的代碼

當程序執行到 goto label; 時,它會立即跳轉到 label: 所在的位置,并從那里的代碼繼續執行。

代碼示例

下面的程序演示了 goto 的基本用法,模擬了一個簡單的循環:

#include <stdio.h>int main() {int count = 0;start: // 這是一個標簽printf("Count = %d\n", count);count++;if (count < 5) {goto start; // 跳回 start 標簽,實現循環效果}printf("Loop ended.\n");return 0;
}

輸出:

Count = 0
Count = 1
Count = 2
Count = 3
Count = 4
Loop ended.

goto 的常見用途(盡管不推薦)

盡管不建議隨意使用,但在某些特定場景下,goto 可以提供一種簡潔的解決方案:
1、從多層嵌套中退出:
這是 goto 最被認可的合法用途之一。當代碼有多層循環(for、while)或 switch 嵌套時,使用 goto 可以一次性跳出所有嵌套層,比使用多個 break 語句更清晰。

for (...) {while (...) {if (some_error_condition) {goto error_handler; // 直接跳出所有循環}}
}
error_handler:// 錯誤處理代碼

2、集中清理資源:
在函數中,如果申請了多個資源(如內存、文件句柄、鎖等),并且在后續步驟中可能出錯,可以使用 goto 跳轉到一個統一的清理代碼塊,避免代碼重復。

int some_function() {FILE *file1 = NULL, *file2 = NULL;int *memory = NULL;file1 = fopen("file1.txt", "r");if (file1 == NULL) {goto cleanup;}memory = malloc(100 * sizeof(int));if (memory == NULL) {goto cleanup; // 分配失敗,跳轉到清理環節}file2 = fopen("file2.txt", "w");if (file2 == NULL) {goto cleanup; // 打開失敗,跳轉到清理環節}// ... 正常工作的代碼 ...// 一切正常,先釋放資源再返回fclose(file1);fclose(file2);free(memory);return 0;cleanup: // 統一的清理標簽// 根據哪些資源申請成功了,來釋放它們if (file1) fclose(file1);if (file2) fclose(file2);if (memory) free(memory);return -1; // 返回錯誤碼
}

Linux內核代碼中就大量使用了這種模式進行錯誤處理。

為什么 goto 聲名狼藉?(goto的缺點)

濫用 goto 會導致非常嚴重的問題,形成所謂的“意大利面條代碼(Spaghetti Code)”:
1、破壞程序結構:goto 使程序的控制流變得混亂且難以追蹤,打破了單入口單出口的結構化編程原則。
2、降低可讀性:代碼的執行順序不再是自上而下,而是跳來跳去,讓閱讀和維護代碼的人非常困惑。
3、難以調試:調試器通常按順序執行,goto 的隨意跳轉會增加調試的難度。
4、可能引入錯誤:例如,跳過一個變量的初始化語句會導致未定義行為。

如何避免使用 goto?(替代方案)

在大多數情況下,都有比 goto 更好的選擇:
1、使用循環結構:for, while, do-while 可以清晰地實現循環邏輯。
2、使用函數和返回:將代碼塊提取成函數,用 return 語句代替跳轉。
3、使用 break 和 continue:用于控制循環的流程。
4、使用標志變量:在多層循環中,可以設置一個標志變量,在每一層循環都檢查它來實現退出。

改寫上面的“多層嵌套退出”例子(不使用 goto):

int flag = 0; // 設置一個標志
for (...) {while (...) {if (some_error_condition) {flag = 1;break; // 先跳出內層循環}}if (flag) {break; // 再跳出外層循環}
}
// 然后在這里進行錯誤處理

雖然代碼多了一點,但結構更清晰,更容易理解。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/100264.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/100264.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/100264.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Flask框架的簡單了解

&#x1f91f;致敬讀者 &#x1f7e9;感謝閱讀&#x1f7e6;笑口常開&#x1f7ea;生日快樂?早點睡覺 &#x1f4d8;博主相關 &#x1f7e7;博主信息&#x1f7e8;博客首頁&#x1f7eb;專欄推薦&#x1f7e5;活動信息 文章目錄1. 前言2. 簡介3. 核心特點4. 代碼實例5. 主要…

——貪心算法——

目錄 1 檸檬水找零 2 將數組和減半的最少操作次數 3 最大數 4 擺動序列 5 最長遞增子序列 6 遞增的三元子序列 7 最長連續遞增序列 8 買賣股票的最佳時機 9 買賣股票的最佳時機 II 10 K 次取反后最大化的數組和 11 按身高排序 12 優勢洗牌 13 最長回文串 14 增減…

網絡操作系統與分布式操作系統的區別

網絡操作系統與分布式操作系統的區別架構設計網絡操作系統&#xff08;NOS&#xff09;基于客戶端-服務器模型&#xff0c;通過共享資源&#xff08;如文件、打印機&#xff09;提供服務&#xff0c;各節點保留獨立的管理和數據處理能力。分布式操作系統&#xff08;DOS&#x…

RabbitMQ—運維篇

RabbitMQ安裝 RabbitMQ需要依賴erlang&#xff0c;如果普通安裝需要安裝erlang并保證二者兼容&#xff0c;因此選擇較為簡單的docker安裝方式 1.獲取rabbitmq鏡像 docker pull rabbitmq:3.11.19-management #rabbitmq-management表示帶有客戶端&#xff08;控制臺&#xff09; …

【學習K230-例程21】GT6700-UDP-Client

B站視頻 UDP 簡介 UDP 是 User Datagram Protocol 的簡稱&#xff0c;中文名是用戶數據報協議&#xff0c;是 OSI&#xff08;Open SystemInterconnection&#xff0c;開放式系統互聯&#xff09;參考模型中一種無連接的傳輸層協議&#xff0c;提供面向事務的簡單不可靠信息傳送…

LazyLLM教程 | 第9講:微調實踐:讓大模型和向量模型更懂你的領域

前面教程中&#xff0c;我們通過優化檢索策略、召回重排略以及基于大模型的查詢重寫策略來提升了RAG系統的檢索精度&#xff0c;但最終回復的結果還需要經過大模型的融合和處理&#xff0c;模型能力的強弱直接影響到最終的結果。這就好比一道好的菜不僅需要有高質量的食材&…

六、vue3后臺項目系列——頁面自適應設計+pinia,vuex的使用

前言&#xff1a;在頁面加入自適應是提高用戶體驗的一種形式&#xff0c;甚至有時候是手機用戶&#xff0c;我們就需要做一個自適應處理&#xff0c;其中肯定會涉及一些狀態條件的判斷&#xff0c;而這些關鍵的條件就是我們用來切換樣式的關鍵&#xff0c;所以我們需要使用狀態…

視頻講解|Python用ResNet殘差神經網絡在大腦出血CT圖像描數據預測應用

全文鏈接&#xff1a;https://tecdat.cn/?p43843 原文出處&#xff1a;拓端抖音號拓端tecdat 分析師&#xff1a;Zikun Zhang 視頻講解Python用ResNet殘差神經網絡在大腦出血CT圖像描數據預測在臨床醫療影像診斷中&#xff0c;大腦出血的快速準確識別直接關系到患者的救治效率…

Mysql中有那些鎖

按照鎖的力度分&#xff1a;1.行級鎖2.表級鎖3.全局鎖4.頁級鎖innodb不支持頁鎖全局鎖全局鎖指的是對整個數據庫實例加鎖&#xff0c;一般用于數據庫的表級鎖表鎖 是對整張表進行加鎖。表級鎖還有以下幾種&#xff1a;意向鎖&#xff1a;意向鎖是指&#xff0c;我們在事務請求表…

基于 CoT 思維鏈協調多 MCP 工具:依托亞馬遜云科技服務打造全流程智能的 Amazon Redshift 運維體系

基于 CoT 思維鏈協調多 MCP 工具&#xff1a;依托亞馬遜云科技服務打造全流程智能的 Amazon Redshift 運維體系 新用戶可獲得高達 200 美元的服務抵扣金 亞馬遜云科技新用戶可以免費使用亞馬遜云科技免費套餐&#xff08;Amazon Free Tier&#xff09;。注冊即可獲得 100 美元的…

手機群控平臺的智能管控技術深度解析

手機群控平臺作為數字化運營的核心工具&#xff0c;正在重塑移動設備管理的技術邊界。其核心價值在于通過集中化控制實現批量化操作&#xff0c;同時借助智能化算法提升管控效率。本文將深入探討其技術架構與實現方案。平臺架構與核心技術手機群控平臺采用分布式架構設計&#…

Spring Boot 生命周期與核心擴展點全解析(含實操案例)

在Spring Boot開發中,理解應用的生命周期是實現優雅啟動、資源管理與故障處理的關鍵。不同于傳統Spring框架需要繁瑣的XML配置,Spring Boot通過自動配置簡化了開發流程,但其生命周期的底層邏輯仍延續并增強了Spring的核心機制。本文將從“生命周期階段劃分”“核心擴展點原理…

69-SQLite應用

1. SQLite操作 1.1了解數據庫1.2 操作數據庫步驟# -*- coding: utf-8 -*- """ Project : 01-python-learn File : 03_SQLite3添加數據.py IDE : PyCharm Author : 劉慶東 Date : 2025/9/15 14:05 """ # 1. 導入模塊 import sqlite3 …

Nginx - 正向vs反向代理

參考: https://blog.csdn.net/william_n/article/details/127387009 AI問答?? Nginx 正向代理 vs 反向代理詳解?? ??1. 正向代理&#xff08;Forward Proxy&#xff09;?? ??定義?? ??客戶端主動配置??的代理服務器&#xff0c;代表客戶端向外部服務器發送請…

裝飾器模式在Spring中的案例

設計模式-裝飾器模式 裝飾器模式所解決的問題是&#xff0c;在不改變原來方法代碼的情況下對方法進行修飾&#xff0c;從而豐富方法功能。 Spring架構中的裝飾器模式 在Spring架構中&#xff0c;以線程池進行舉例。 線程池 線程池是一個對線程集中管理的對象&#xff0c;集中管…

云原生與 AI 驅動下的數據工程新圖景——解讀 DZone 2025 數據工程趨勢報告【附報告下載】

在 AI 技術從“實驗性”走向“企業級落地”的關鍵階段&#xff0c;數據工程作為底層支撐的重要性愈發凸顯。近日&#xff0c;DZone 發布的《2025 數據工程趨勢報告》&#xff08;Scaling Intelligence with the Modern Data Stack&#xff09;通過對全球 123 位 IT 專業人士的調…

9.5 機器翻譯與數據集

語言模型是自然語言處理的關鍵&#xff0c;而機器翻譯是語言模型最成功的基準測試&#xff0c;因為機器翻譯正是將輸入序列轉換成輸出序列的序列轉換模型的核心問題。序列轉碼模型在各類現代人工智能應用中國呢發揮著至關重要的作用&#xff0c;因此我們將其作為本章剩余部分和…

Linux 內核鏡像與啟動組件全解析:從 vmlinux 到 extlinux.conf

&#x1f9e0; Linux 內核鏡像與啟動組件全解析&#xff1a;從 vmlinux 到 extlinux.conf 在嵌入式 Linux 系統中&#xff0c;啟動流程涉及多個關鍵文件和機制。不同的鏡像格式和配置文件承擔著不同的職責&#xff0c;從內核編譯到 bootloader 加載&#xff0c;再到系統啟動。本…

【系統分析師】2024年下半年真題:論文及解題思路

更多內容請見: 備考系統分析師-專欄介紹和目錄 文章目錄 試題一:論devops在企業信息系統開發中的應用 試題二:論系統業務流程分析方法及應用 試題三:論軟件測試方法及應用 試題四:論信息系統運維管理 試題一:論devops在企業信息系統開發中的應用 1、概要敘述你參與管理和…

AI GEO 實戰:借百度文小言優化,讓企業名稱成搜索熱詞

在當今數字化浪潮中&#xff0c;企業的線上曝光度和搜索可見性至關重要。百度作為國內占據主導地位的搜索引擎&#xff0c;其推出的大模型文小言蘊含著巨大的潛力。通過巧妙運用 AI GEO&#xff08;生成式引擎優化&#xff09;策略&#xff0c;企業完全有可能讓自己的公司名稱成…