我發(fā)現(xiàn)我根本不會(huì)C語言
其實(shí)本來半年前就應(yīng)該跟C語言說再見的,但是因?yàn)榻衲晟习肽赀€需要參加比賽,需要用C/C++來搞算法,以及為自己編寫一個(gè)操作系統(tǒng)。
雖然C語言不是我接觸第一個(gè)編程語言,卻是我使用最久的語言。曾經(jīng)以為,自己理解了C語言的指針,能拿C語言輕松的搞搞算法,自己就算是會(huì)C語言了,其實(shí)我錯(cuò)了。
對(duì)于C語言,我可以這樣秀:比如當(dāng)創(chuàng)建一個(gè)數(shù)組arr[n]之后,一般我們?nèi)ケ闅v數(shù)組的時(shí)候是for (int i = 0; i < n; i++) { a[i]; }但是我知道下表訪問符[]是個(gè)語法糖,也就是說a[i]在編譯器看來是*(a+ i)所以,遍歷數(shù)組的時(shí)候可以這么寫:for (int i = 0; i < n; i++) { i[a]; }我相信一般人沒這么試過。
另一個(gè),比如入門語言的第一個(gè)程序,打印hello world程序,在發(fā)明C語言的那個(gè)時(shí)代,沒有異常處理(try-catch),所以只能通過函數(shù)的返回值來判斷函數(shù)執(zhí)行的結(jié)果。所以我可以這么秀:
#include <stdio.h>
int main() {
return 0 * printf("hello world\n");
}
但是,當(dāng)我在讀 Joe Armstrong先生的著作是,我看到了如下的代碼。
%% API
-export([area/1]).
area({rectangle, Width, Ht}) -> Width * Ht;
area({square, X}) -> X * X;
area({circle, R}) -> math:pi() * R * R.
enum ShapeType { Rectangle, Circle, Square };
struct Shape {
enum ShapeType kind;
union {
struct { int width, height; } rectangleData;
struct { int radius; } circleData;
struct { int side } squareData
} shapeDate;
};
double area(struct Shape* s) {
if (s->kind == Rectangle) {
int width, height;
width = s->shapeDate.rectangleData.width;
height = s->shapeDate.rectangleData.height;
return width * height;
} else if (s->kind == Circle)
...
當(dāng)時(shí)我看完之后,感觸挺大的——握槽,代碼可以寫的這么優(yōu)雅,自己C語言白寫了。
我自己是看過一些C語言的API的,其中的代碼對(duì)于基礎(chǔ)類型的使用還是非常好的,比如有時(shí)候會(huì)使用上大家不常用的short。可以節(jié)省內(nèi)存,也能滿足需求。
對(duì)于C語言,我寫的都是toy code,基本沒寫出什么有用的代碼。
確實(shí)該跟C語言所再見了,等我未來兩三個(gè)月解決完我編寫操作系統(tǒng)的內(nèi)核,就徹底的不再碰C語言了。或許像Java這樣避免程序員犯錯(cuò)誤的語言才更適合我。