① Linux C - C基礎篇(一)
1) 最高位是符號位,0表示正數,1表示負數。
2) 如果是正數,正常表示(即原碼),如果是負數,先求反碼,再求補碼(補碼為反碼加1)即為他的二進製表示。例如char型的1,用二進製表示為00000001;char型的-1用二進製表示為11111111。
常量,就是在程序運行過程中值無法被改變;變數,就是在程序運行過程中內部存儲的值隨時可以被改變。變數是「可讀、可寫」,而常量,是「只讀」的。
整形常量:12、浮點型常量:12.35、實數型常量:1.3e-5、字元型常量:'a'、字元串型常量:"abc"、標識符常量:#define LEN 10。
變數一般存放在內存中:棧區, 靜態數據區,全局變數區, 堆區。函數中定義的變數,如果不加特殊修飾,都是保存在棧區,函數調用結束,棧空間被自動釋放。
定義變數:
<存儲類型> <數據類型> <變數名>
static/auto/... int/char a
例如:static int a;char c;
存儲類型:
自動類型轉換
將一種類型的數據賦值給另外一種類型的變數時就會發生自動類型轉換,例如:float a = 10;10是int類型的數據,需要先轉換成float類型然後再賦值給變數a。
在不同類型的混合運算中,編譯器也會自動地轉換數據類型,將參與運算的所有數據先轉換為同一種類型,然後再進行計算。轉換的規則如下:
強制類型轉換
自動類型轉換是編譯器根據代碼自己判斷的,有時候我們需要手動的進行數據類型轉換,稱之為強制類型轉換,例如:
(int)(a+b); //將a + b 求得結果的數據類型強制轉換為int型。
運算符的優先順序
特殊運算符>單目運算符>雙目運算符>三目運算>賦值運算>逗號運算
② Linux GNU C 和 ANSI C 的區別
Linux環境下的C編程主要依賴GNU C編譯器,它在標准C的基礎上進行了一系列擴展,增強了C語言的功能。以下是GNU C與ANSI C的一些關鍵區別:
1.
零長度和變數長度數組:GNU C允許使用零長度數組,這對於處理變長數據結構非常有用。例如,你可以定義一個不分配內存的數組,僅用於指明數據結構的結構。
2.
Case范圍:GNU C支持case x…y的語法,擴展了標准C的case語句范圍,使得程序更加靈活。
3.
語句表達式:GNU C中的括弧復合語句被看作表達式,這使得在更廣泛的上下文中使用復雜的控制結構成為可能。
4.
Typeof關鍵字:GNU C允許使用typeof獲取變數類型,這在定義宏時很有用,避免了傳遞類型作為參數的繁瑣。
5.
可變參數宏:GNU C支持可變參數宏,使得函數參數的數量可以根據需要動態調整,如printf函數在宏中的應用。
6.
標號元素:GNU C允許數組和結構體的初始化值按任意順序,提供了更大的靈活性。
7.
當前函數名:GNU C提供了__FUNCTION__和__PRETTY_FUNCTION__來獲取當前函數名,C99的__func__更推薦使用。
8.
特殊屬性聲明:GNU C支持如noreturn、format等屬性,用於優化代碼和自定義檢查方法。
9.
內建函數:GNU C提供了大量內建函數,包括對標准庫函數的優化版本和一些特定用途的函數,如返回地址和常數檢測。
10.
兼容性與擴展:如果使用「-ansi–pedantic」選項,gcc會限制使用GNU擴展,如上述的某些特性可能不再可用。
以上是GNU C相對於標准C的主要擴展點,這些特性在Linux內核編程中發揮著重要作用。