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

C語言拾遺:const、volatile、柔性陣列、貪心解析、預處理宏

     編輯:關於C語言

1. const 修飾符

  • 被 const 修飾的變數具唯讀屬性,但本質非常數(const int != 常數)。
  • 定義時必須初始化(函數參數除外)。
  • 編譯器優化:通常不分配儲存空間,保留在符號表中,成為編譯期常值,效率高。
  • 與 #define 差異:const 有型別、單一拷貝、編譯期確定;#define 無型別、多拷貝、預處理替換。

typedef 遇上 const

typedef struct student { ... } Stu_st, *Stu_pst;
const Stu_pst stu3;  // 等價於 Stu_pst const stu3;
Stu_pst const stu4;

兩者類型相同。typedef 不像 #define 直接展開,const 修飾的是變數本身,不考慮型別細節。

2. volatile 關鍵字

  • 型別修飾符,表示變數可能被編譯器未知因素(作業系統、硬體、其他執行緒)改變。
  • 編譯器不再優化對該變數的存取,確保對特殊地址的穩定訪問。

3. 結構體進階:柔性陣列

C99 特性,又稱零長度陣列。定義:

struct line {
    int length;
    char contents[]; // 柔性陣列
};
  • 柔性陣列長度為 0,sizeof 不包含其大小。
  • 前方必須至少有一個成員。
  • 動態分配:malloc(sizeof(struct line) + this_length)。
  • C90 需寫 contents[0],C99 可直接 contents[]。

4. 運算式解析的貪心法則

編譯器語法分析時採用貪心法則:若當前字元可與前一字元組成有意義符號,則繼續讀入,直到無法組成。例:a+++b 解析為 (a++) + b(因 a++ 合法,a+++ 非法)。

5. 實用預處理指令

  • #line number ["filename"]:改變當前行號與檔案名。
  • #error:編譯時產生錯誤訊息並停止編譯。

預定義宏:__LINE__、__FILE__、__TIME__、__STDC__。

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