首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C >> C 語言入門

C語言良好編程習慣進階(二):變數命名、參數傳遞、靜態儲存與遞歸

     編輯:C 語言入門

前言

本文繼續探討C語言編程中的核心習慣,涵蓋變數命名規範、參數傳遞策略、靜態儲存類別特性、遞歸與非遞歸轉換、全域變數使用原則、內部函數封裝、密碼輸入隱藏、字元輸出行為、檔案關閉時機、文字模式定位陷阱、高階檔案API優勢、檔案句柄命名、重命名/刪除操作前置條件等實戰要點。

一、變數命名三大原則

  1. 見名知義:int max_retry_count; 優於 int mrc;,減少註釋需求。
  2. 首字母小寫:區域/全域變數用小寫開頭(user_age),巨集/常數全大寫(MAX_BUFFER),型別/結構體標籤大寫開頭(struct Node)。
  3. 多單詞分隔:駝峰式(userName)或下劃線(user_name),專案統一風格。

二、參數傳遞:傳值 vs 傳常數引用

  • 僅內建型別(int, float, char 等)與函數物件適合傳值。
  • 結構體、陣列、類物件優先傳常數引用(const StructType ¶m):
    • 避免拷貝開銷(效率)。
    • 防止「切片問題」(傳值時衍生類物件被切割為基類)。

C語言無原生引用,模擬方式:void func(const BigStruct *const ptr)(指標本身const + 指向資料const)。

三、靜態儲存變數初始化鐵律

static 修飾的變數(全域或區域)在編譯階段完成儲存分配與初始化。若未顯式初始化,某些編譯器可能報錯或產生不定值。

強制規範:宣告靜態變數時必須顯式初始化。

static int counter = 0;      // 正確
static const char *msg = "OK"; // 正確
static int bad;              // 危險!嚴禁

四、遞歸:數學公式 ≠ 程式遞歸

  • 並非所有遞歸數學定義都適合直接轉為遞歸函數(如斐波那契數列遞歸版指數級複雜度)。
  • 大型專案中需權衡可理解性(遞歸碼簡潔)與效率(迭代/動態規劃/尾遞歸優化)。
  • 理論上,任何遞歸皆可透過手動模擬堆疊轉為非遞歸迴圈。

五、全域變數:極度克制

只有當絕大多數函數都需要存取某資料時,才考慮全域變數。少數函數需求時,透過參數傳遞,保持模組低耦合、高內聚。

六、內部函數(static函數)的封裝價值

  • static void internal_helper() 僅在本編譯單元可見。
  • 防止其他檔案誤呼叫導致資料破壞(連結階段不會衝突同名static函數)。
  • 實現「編譯單元私有介面」,是C語言模組化的基石。

七、實用技巧集錦

場景技巧說明
密碼輸入getch()無回顯讀取字元,實現密碼隱形輸入
字元輸出換行putchar/putch超出視窗右邊界自動換行;視窗滿時整體上捲
檔案關閉顯式fclose()程式異常結束可能導致緩衝區資料未刷入磁碟,造成資料遺失
文字模式定位慎用fseek文字模式下 \r\n 視為兩字元,fseek 偏移計算易出錯
高階檔案API優先fopen/fgetc標準庫函數可讀性強,利於團隊協作維護
檔案句柄命名全大寫FILE *FP_LOG; 與變數區分,提升可讀性
重命名檔案rename()前必須fclose()開啟狀態下重命名行為未定義;跨權限目錄重命名不提升權限
刪除檔案remove()前必須fclose()同理,開啟檔案無法安全刪除

八、總結

細節決定成敗。將命名規範、參數策略、靜態初始化、遞歸權衡、全域克制、static封裝、資源管理(檔案關閉)內化為編碼直覺,是從「能跑」邁向「專業、可維護」的關鍵一步。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved