C語言一個很重要的特點是簡潔。但有時候它太簡潔了,僅增加,修改或刪除一個字元,原先的程式就可以截然不同。
簡潔的C語言會讓一個符號,在不同的上下文環境裡表示不同的意思。這稱之為符號“重載”。
比如void符號,會有以下常見的不同含義:
1>作為函數的傳回型別,表示不返回任何值
2>在指標聲明中,表示通用指標
3>位於函數的參數列表中,表示沒有參數
再來舉個乘號*的例子,看看有趣的,“糟糕的”符號重載吧。
上代碼:
1 #include <stdio.h> 2 3 int main() 4 { 5 int p, N = 5, *q = &N; 6 7 p = N * sizeof * q; 8 printf("p = %d.\n", p); 9 10 p = N * sizeof(int) * p;11 printf("p = %d.\n", p);12 13 p = N * sizeof((int) * q);14 printf("p = %d.\n", p);15 16 /* 錯誤: 雙目運算子 * 運算元(‘unsigned int’和‘int *’)無效*/17 //p = N * sizeof(int) * q;18 //printf("p = %d.\n", p);19 20 return 0;21 }
先不要看變數的定義(因為變數的類型會有提示作用哦),直接看line7,10,13,17的運算式,你知道分別表示什麼意思嗎?
好了,看結果吧,
randy@ubuntu:~/C_Language$ ./a.out
p = 20.
p = 400.
p = 20.
解釋:
line7:又遇到sizeof了,記住,sizeof是運算子,不是函數。sizeof的運算元是類型時,必須叫括弧,比如sizeof(int)。N=5,q是指標,指向N的地址,
所以*q=5,是int類型,sizeof(int)=4,故p=5*4=20.
line10:p=5*4*20=400.
line13:其實是跟line7一樣一樣兒的。
line17:該運算式被我注掉了,因為編譯不通過。應該知道原因了吧?(答案在注釋)
小結:例子中,一個小小的*是不是有點繞人,當然還有很多其他符號重載的例子。
比如 static,extern, &, <, () 等。
這是C語言的簡潔之美呢,還是簡潔之痛呢?拋磚引玉,歡迎討論!
---End---