K&Rを読もう(0) Hello, World

K&Rが発行されたのは1978年。それから30年近くの年月が流れた。未だにC言語のバイブルとして君臨しているのにはそれなりに訳があるはず。ちょっと斜め読んで見たところ、「よく見るプログラム」が多数ある。

温度変換、単語の数え上げ、逆ポーランド電卓・・・。

そう。僕が「バイブルと呼ばれる理由がわからない」と思ったのは、K&Rに書かれていることが「普通」だからだ。


プログラミング言語を覚えるときはこれを目指す。

#include <stdio.h>

main()
{
    printf("hello, world\n");
}

うっほ。最高に意味不明!!

これこそが、世界一有名なプログラム。「hello, world」。世界中のプログラマが最高に意味不明な文章を表示し、インストールできたこと、コンパイル出来たことを確認するのだ。30年という年月が、「バイブル」を「普通」に変えた。だが僕は「普通」を知らない。

そんなわけで、K&Rも読んでいこうと思う。ただ、普通に読んでも面白くないので、SICPの実践として、K&Rを読んでみたい。

1.2の温度変換をSICP風に直すとこんな感じ。

#include <stdio.h>
#include <stdlib.h>

static void iter(int start, int end, int step, void (*proc)(int));
static void fahr_to_celsius(int fahr);

int main(void)
{
    void (*f)(int) = fahr_to_celsius;

    iter(0, 300, 30, f);
    exit(EXIT_SUCCESS);
}

static void iter(int start, int end, int step, void (*proc)(int))
{
    int i;
    for (i = start; i <= end; i += step)
        proc(i);
}

static void fahr_to_celsius(int fahr) {
    printf("%d\t%d\n", fahr, 5 * (fahr - 32) / 9);
}

バリバリ関数ポインタ使っていきますよ。

実行結果

0       -17
30      -1
60      15
90      32
120     48
150     65
180     82
210     98
240     115
270     132
300     148

最終的には、最高に意味不明なGNU lsが読めるようになりたいと思う。