大师网-带你快速走向大师之路 解决你在学习过程中的疑惑,带你快速进入大师之门。节省时间,提升效率

再见,我曾经喜欢的C语言

我发现我根本不会C语言

其实本来半年前就应该跟C语言说再见的,但是因为今年上半年还需要参加比赛,需要用C/C++来搞算法,以及为自己编写一个操作系统。

虽然C语言不是我接触第一个编程语言,却是我使用最久的语言。曾经以为,自己理解了C语言的指针,能拿C语言轻松的搞搞算法,自己就算是会C语言了,其实我错了。

对于C语言,我可以这样秀:比如当创建一个数组arr[n]之后,一般我们去遍历数组的时候是for (int i = 0; i < n; i++) { a[i]; }但是我知道下表访问符[]是个语法糖,也就是说a[i]在编译器看来是*(a+ i)所以,遍历数组的时候可以这么写:for (int i = 0; i < n; i++) { i[a]; }我相信一般人没这么试过。

另一个,比如入门语言的第一个程序,打印hello world程序,在发明C语言的那个时代,没有异常处理(try-catch),所以只能通过函数的返回值来判断函数执行的结果。所以我可以这么秀:

#include <stdio.h>

int main() {
    return 0 * printf("hello world\n");
}

但是,当我在读 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)
        ...

当时我看完之后,感触挺大的——握槽,代码可以写的这么优雅,自己C语言白写了。

我自己是看过一些C语言的API的,其中的代码对于基础类型的使用还是非常好的,比如有时候会使用上大家不常用的short。可以节省内存,也能满足需求。

对于C语言,我写的都是toy code,基本没写出什么有用的代码。

确实该跟C语言所再见了,等我未来两三个月解决完我编写操作系统的内核,就彻底的不再碰C语言了。或许像Java这样避免程序员犯错误的语言才更适合我。