這個是<<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。