我发现我根本不会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这样避免程序员犯错误的语言才更适合我。