Linux c編程一站式學習筆記(08), 幾個運算符

這個是<<Linux c 一站式學習>>中的總結,有較多摘錄, 詳細請查看原書246頁

()逗號運算符(CommaOperator)

也是一種雙目運算符,它的形式是表達式1,表達式2,兩個表達式不要求類型一致,左邊的表達式1先求值,

求完了直接把值丟掉,再求右邊表達式2的值作爲整個表達式的值。逗號運算符是左結合的,類似於+- * /運算符,根據組合規則可以寫出表達式1,表達式2,表達式3,...,表達式n這種形式,表達式1,表達式2可以看作一個子表達式,先求表達式1的值,然後求表達式2的值作爲這個子表達式的值,然後這個值再和表達式3組成一個更大的表達式,求表達式3的值作爲這個更大的表達式的值,依此類推,整個計算過程就是從左到右依次求值,最後一個表達式的值成爲整個表達式的值。

注意,函數調用時各實參之間也是用逗號隔開,這種逗號是分隔符而不是逗號運算符。但可以這樣

使用逗號運算符:

f(a, (t=3, t+2), c)

傳給函數f的參數有三個,其中第二個參數的值是表達式t+2的值。

()sizeof

比如用sizeof運算符求一個數組的長度:

int a[12];

printf("%d\n",sizeof a/sizeof a[0]);

在上面這個例子中,由於sizeof表達式中的子表達式不需要求值,所以不需要到運行時才計算,

實上在編譯時就知道sizeofa的值是48,sizeof a[0]的值是4,所以在編譯時就已經把sizeof

a/sizeof a[0]替換成常量12,這是一個常量表達式。

sizeof運算符的結果是size_t類型的,這個類型定義在stddef.h頭文件中,不過你的代碼中只要不

出現size_t這個類型名就不用包含這個頭文件,比如像上面的例子就不用包含這個頭文件。C標準

規定size_t是一種無符號整型,編譯器可以用typedef做一個類型聲明:

typedef unsigned longsize_t;

那麼size_t就代表unsignedlong型。不同平臺的編譯器可能會根據自己平臺的具體情況定

size_t所代表的類型,比如有的平臺定義爲unsignedlong,有的平臺定義爲unsignedlong

long ,C標準規定size_t這個名字就是爲了隱藏這些細節,使代碼具有可移植性。所以注意不要

size_t類型和它所代表的真實類型混用,例如:

unsigned long x;

size_t y;

x = y;

如果在一種ILP32平臺上定義size_t代表unsignedlong long ,這段代碼把y賦給x時就把高位截

掉了,結果可能是錯的。

()typedef

typedef這個關鍵字用於給某種類型起個新名字,比如上面的typedef聲明可以這麼看:

typedef就成了一個變量聲明unsignedlong size_t; size_t是一個變量名,類型是unsigned

long ,那麼加上typedef之後,size_t就是一個類型名,就代表unsignedlong類型。再舉個例子:

typedef chararray_t[10];

array_t a;

這相當於聲明chara[10];。類型名也遵循標識符的命名規則,並且通常加個_t後綴表示Type


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章