似非プログラマのうんちく

「似非プログラマの覚え書き」出張版

よくわかるかどうかわからない現代魔法(その 1)

ライトノベルよくわかる現代魔法」で扱われるところの「現代魔法」が「プログラミング」のことであるのは、読んだことがある方ならご存じかと思う。今回は C のプログラムを題材に、いかにも魔法を解説するかのごとく、どうやってプログラミングを進めるか書いてみたい。

初歩的な「魔法」

#include <stdio.h>

int main() {
    printf("Hello, World!");
    return 0;
}

画面に

Hello, World!

と表示するための「魔法」である。

「魔導書」の準備

「魔法」を使うためには「魔導書」が必要だ。最初の

#include <stdio.h>

はどの「魔導書」を使うのか宣言している。stdio.h はもっとも基本的な「魔導書」で、C の「魔法」の「呪文」を唱えるには必須である。*1

「呪文詠唱」の準備
int main() {
    ....
    return 0;
}

ここが「魔法」の本体であり、ここに書かれた「呪文」が順番に「発動」する。最後の

return 0;

は、「魔法」が暴走しなかった(正常に終了した)ことをコンピュータに知らせるものである。

「呪文」を書く
printf("Hello, World!");

これが今回「発動」させたい「呪文」である。printf() は、画面に表示させたいものを「呪文」に書き添えることで効力を発揮する。

「魔法」を完成させる

最後に「魔法」を完成させよう。Windows なら MinGW などの「道具」を使って完成させる。何でもそうだが何もないところからは何も出てこない。「魔法」もしかり。何かしら「道具」は必要なのだ。MinGW は「魔法使いの七つ道具」*2みたいなものか。

gcc magic.c -o magic.exe

これで「魔法」は完成だ。

「魔法」の発動

完成した「魔法」を発動させるのは簡単だ。

magic

ようこそ、「魔法」の世界へ !

少し発展させてみる

さて、あなたは今から 97 と 104 の積を画面に表示させる「呪文」を唱えなければならない。いくら暗算が得意な人でも、とっさにこいつの答を出すのは大変だ。その一瞬の隙で、敵に攻撃されちまうぜ ? しかし現代魔法なら安心だ。こいつを唱えればいい。

#include <stdio.h>

int main() {
    printf("%d", 97 * 104);
    return 0;
}

現代魔法は掛け算まで勝手にやってくれるってわけだ。さすが。

ところで、今回は printf()に二つほど書き添えた。一つ目が表示させたいものであることは同じだが、そこにある %d とは何だろう。実はこれは「表示したいものの形式」を表している。printf() は少々頭の固い「呪文」で、基本的には「表示したい『文字列』」しか書き添えることができない。つまり横着して

#include <stdio.h>

int main() {
    printf(97 * 104);
    return 0;
}

とは書けないのである。

magic.c: In function 'main':
magic.c:4:5: warning: passing argument 1 of 'printf' makes pointer from integer without a cast
c:\mingw\bin\../lib/gcc/x86_64-w64-mingw32/4.5.4/../../../../x86_64-w64-mingw32/include/stdio.h:217:15: note: expected 'const char * __restrict__' but argument is of type 'int'

「『呪文』の使い方が違うぜ ?」と怒られた。

しかし文字列の中に「『表示したいものの形式』を表す文字列」を忍ばせることで、そこに計算結果のようなものを埋め込むことができる。こいつはさながら「ルーン文字」と言ったところか。

「ルーン文字」の使用によって「呪文」が拡張され、新たに本来表示したかった計算結果を、計算結果ではなく計算式によって書き添えることができるようになった。

「魔法」の世界は奥が深い

もちろん、「魔法」でできることはこれだけではない。次回はもう少し高度な「魔法」をお見せしよう。

*1:技術的なお話。stdio.h は標準入出力のためのヘッダファイルである。

*2:もちろん、その中には「魔導書」も含まれている。