再見,我曾經(jīng)喜歡的C語言

我發(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ò)誤的語言才更適合我。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容