C 語言之美(一)
先來看一段 C 語言代碼:
void strcpy(char *dest, char *src)n{ntwhile (*dest++ = *src++) ;n}n
這段代碼的含義大家想必都清楚:將 src 字元串的內容拷貝至 dest 中。它相當簡潔,於是也就顯得優美。可是,要想變得這麼優美,在語言上必須有以下幾個設計上的支持。
一、字元串以 0 作為結束
反觀另一些語言,選擇了使用一個整型來存儲字元串的長度。這兩種設計各有優劣。C 語言的這種設計,使得字元串更像是一個流。除了更節省空間之外(一般而言,計算機的字長大於8位),還有一個好處是使得字元串的表達更簡潔,只需要一個首地址指針即可。
反觀,如果C語言的字元串結構如下,strcpy 函數也簡潔。
struct stringn{ntint size;ntchar *data;n};nnvoid strcpy(string *dest, string *src)n{ntfor (int i = 0; i < src->size; ++i)nttdest->data[i] = src->data[i];n}n
但顯然不夠簡潔。
二、賦值語句也有值
在 c 語言中, a=b 的值是 a。很多人抨擊這個設計。不過,這是一個很有意思的設計,它使得判斷和副作用「同時」發生。
c 語言中有一個很常見的 pattern:
int foo()n{ntint err;ntif (err = do_a())nttreturn err;ntif (err = do_b())nttreturn err;ntif (err = do_c())nttreturn err;n}n
我可以將這個 pattern 總結成一句話:儘力去做,不行就撤。
如果將代碼比做詩,韻律和節奏就在此時出來了。
c 語言有表達式和語句兩種語法體,表達式都有值(當然,值可能會被拋棄),語句都有作用。c 語言竭力模糊兩者,以便更靈活,也更有效率。
三、前置算符和後置算符
c 語言有兩個神奇的運算符,放在前面和後面,產生副作用的時機不同。考試中常見,也被很多人詬病。
但我很喜歡這個設計,因為這使得一些常見的操作變得緊湊而優雅。
比如棧的常用操作:
int stack[1000];nint p = 0;nstack[p++] = x; // pushnstack[p++] = y; // pushny = stack[--p]; // popn
C 語言並不會常見將 stack 封裝成類,因為 c 語言開始流行的時候,面向對象還沒開始流行。
現在呢?也不一定會。因為 c 是面向數據的,在寫遊戲的時候,這種模式對緩存更友好。
你知道的 「c 成語」 越多,你的能力就越強。
C 語言的美妙之處當然不止這些,或許以後我還會繼續寫下去。
推薦閱讀:
※計算機病毒能夠以毒攻毒嗎?
※深入PCI與PCIe之二:軟體篇
※什麼樣的技術 Leader 是稱職的?
※做遊戲,學編程(C語言) 5 數組之生命遊戲
※給你講個來自《格列佛遊記》的計算機故事