新・闘わないプログラマ No.174

おまじない


「ではまず、今日は初めてということで、非常に簡単なC言語のプログラムを見て行くことにします」

    #include <stdio.h>

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

「まあ、こんな感じのものです。ぱっとみて最初に気付くのは小文字を使っている、ということでしょうか。で、このプログラム、何をやっているか、ということなのですけど、なんとなく分かるかも知れませんが『hello, world』という文字を印字しています」
「C言語のプログラムは、関数と呼ばれる処理の単位が集まって出来ています。このプログラムでは『main』という名前の関数が一つだけあります。この関数の定義は『main()』から始まって『}』までの部分になります」

〜〜10分経過〜〜

「というわけで、非常に簡単なC言語のプログラムを見てきたわけですが、なにか質問はありますでしょうか?」
「あのー、一番上の行に『#include <stdio.h>』ってありますけど、これは何でしょうか?」
「あ、やっぱり見つかった? あはははは」
「だから、何なんですか?」
「いやまあ、その、何と言うか、今説明するのは難しい、とでも言うか…。まあその、気付いていても、あえて指摘しない、ってのがオトナの態度だと思うなあ」
「……」
「わかったよ、ちゃんと説明すりゃいいんだろ。それはね、えーと、それはね、おまじない、そうそう、おまじないなの。むかしむかしリッチーさんという人がね、どうしても自分のプログラムのバグが取れなくて困っていたときに、プログラムの最初に『#include <stdio.h>』って書いたら、あら不思議、バグがどんどん消えて行く…それ以来、Cプログラマはみんな、ソースの最初の行に『#include <stdio.h>』っていうおまじないを書くのが慣わしに…なんだよ、その疑わしげな目は。あ、君は私の言うことを信じないわけ?」
「あの、それをどうやって信じろ、と…」
「やだなあ、私が今まで嘘をついたことあった?」
「……」
「はいはい、詳しい説明はここでは出来ませんので、あとでやります。とりあえず、『printf関数』を呼ぶ場合にはこの『#include <stdio.h>』という行を、ソースの最初の方で書く必要がある、と覚えておいて下さい」

プログラミング言語を教えていくと、そこまでにはまだ教えていない、もしくは教えることの出来ないことであっても、それを使わないとプログラムが書けない、という状況がよく発生します。この「#include <stdio.h>」なんかもその一例だったりしますけど、教える方の立場からすると、こういうのは説明に困るので出来るだけ避けたいものです。
教える人によっては、「おまじない」と言う言葉を連発したりするようですけど、私はこの言葉はあまり好きじゃなくて、できるだけ使わないようにしています。でも、C言語を教える上で、「これは、ここではまだ説明できませんので、とりあえずそういうものだと思っておいて下さい。どうしてそうなる(書く)のかは、あとで説明します」などという説明にもなっていない説明を、例えばK&Rをテキストとして教える場合でも、20回以上は言っているような気がします。出来れば言いたくない言葉なんですけどね。
あと、「おまじない」の例として、よく出てくるのに、

    scanf("%d", &n);

の、「&」はいったい何者だ、ってのがありますね。「printf」の場合には、そんなの付けなくていいのに、なぜ「scanf」の場合には必要なんだ、といったような話が。
まあ、K&Rの場合、「scanf」は後ろの方でちょろっと出てくるだけなので、このscanfのおまじないについては言う必要はないのですけど、さすがに「#include <stdio.h>」については、そういうわけにも行かず…これを書かずに済むようなプログラムでC言語を教えるのはさすがに無理ではないか、などと思うわけで。

さて、話は変わりまして、前橋さんのところの掲示板で「void *」型のキャストの話題があって、それで思い出したのですが、やたら意味も無くキャスト演算子を(本人は「おまじない」のつもりかも知れない)使いたがる人間がいました(いろいろな話を聞くと、結構そう言う人がいるようです)。
「いやあ、なんかコンパイル時にわけのわからないエラーが出ちゃってさあ、キャストしたら消えたんだよね」などという怖いことを言いつつ…。だいたい、訳のわからないエラーとやらが出たのはプログラムにバグがあるからであって、強引なキャスト(大抵の場合、ポインタ型へのキャスト)をやって、コンパイルエラーが消えたからと言って、バグが消えるわけじゃないと思うんですけど。
そもそも、Cのポインタは、首尾一貫した使い方をしていれば、キャストが必要になるのは特別な場合に限られるわけでして、やたらキャスト(特にポインタ型のキャスト)が出てくるようなプログラムは、どうも信用できないと言うか、なんか作り方が違うんじゃないの、と思ってしまうわけです。

ところで「おまじない」って「お呪い」って書くんですね。さっき辞書で調べて初めて知りました。「のろい(呪い)」と同じ字なんですね。「プログラムのソースの最初の部分にはお呪いで『#include <stdio.h>』っていう行を書いてね」などと言うと、なんか怖そう。こっちが逆に呪われそうな。

[前へ] [次へ]

[Home] [戻る]


mailto:lepton@amy.hi-ho.ne.jp