カーニハンCを読む 第1章 やさしい入門(1)
先日、演算子の優先度について改めてカーニハンCを読んでみたが、なかなか懐かしくもあってもう少し読んでみようかという気になった。
本の初っぱなが『第1章 やさしい入門』である。
第2章以降は次のように言語の規約に準じた記載になっているが、まずはプログラミングに親しむようにと『やさしい入門』が先にきている。
第1章 やさしい入門
第2章 データ型・演算子・式
第3章 制御の流れ
第4章 関数とプログラム構造
第5章 ポインタと配列
第6章 構造体
第7章 入出力
第8章 UNIXシステム・インタフェース
第1章は、「個々の詳細は横においてまずはちょっとしたプログラムを書いてみよう」という感じである。第2章のデータ型は基本中の基本ではあるが、最初にここをグダグダ初めても面白くもなければ理解も進まない。少しでもプログラムを書いてみれば、データ型についてもとっかかりやすいだろうという考えである。
hello world
そして、最初のプログラムがこれである。
main()
{
printf("hello world\n");
}
お馴染みの「hello world」だ。
この「hello world」もここから始まったのかと思わないでもないのだが、それはさすがに違うようである。本書にも次のように記載されている。
hello world がどこから始まったのか探すのも面白いかもしれないが面倒なのでしない。
さて、先の「hello world」のサンプルプログラムであるが、現在ではコンパイルエラーが2つでる。
1つは、「main」の型が指定されていないこと。
「int main()」としなければならない。
K&R の頃には明記しない場合、デフォルトで「int」型であった。だから、当時、前記サンプルプログラムではエラーにならなかったのである。
2つ目は、「#include <stdio.h>」がないこと。
一見地味なエラーであるが、この意味はかなり大きい。
「#include <stdio.h>」がなくてもエラーにならない問ことは引数や戻り値のチェックをしていないということだ。実際、この当時、呼び出した関数の引数が正しいのかどうかについて、コンパイラがチェックすることはなかった。よく、そんな環境で動かしていたものである。引数の型が間違っている、あるいは引数の数が間違っているということさえあった。間違った引数がポインタでもあろうものなら、暴走まっしぐらである。コード領域以外のところも突っ走ったりしていて、どこからそんなところに入り込んだのかを特定するのは容易ではなかった。プログラムの規模が大きければ、関数呼び出しも膨大である。その1つ1つを間違いなく書くというのも、人には簡単ではない。これは ANSI Cから改定されて、引数をチェックしてくれるようになった。これは本当に助かった。
関数呼出
C言語は「void boo(void)」という関数を呼び出したいとき、次のように書く。
boo();
このことについてカーニハンCでは次のように説明してある。
そうだった。Fortran では サブルーチンを呼び出すときは次のように書くのだった。
call boo
昨今、「call」と書くプログラミング言語をあまり見ないのですっかり忘れていた。
C言語はいちいち「call」と書くのが面倒くさいので、後ろに「()」を付けたらそれが関数呼び出しですよと決めたわけだ。当時はキーボードをガチャガチャするだけでコードを入力していたわけで、いかにキーボードの操作を少なくできるかというのは、結構重要だったんである。
\n
当たり前すぎて気にもならなくなっていたんだが、「\n」ってわりと鬱陶しくって、「\n」を忘れることもしばしばで、1回の printf で3行が出力されてよく見ると「\n」が3つもあったりする。
これを Python は変えてきた。
これで、もう、自動改行である。
さらには三連引用符なるものも作り出してきた。
改行を含む文字列である。
三連引用符とはよく考えたものだ。
Python って「C言語のここがイヤ」みたいな感があって面白い。
もう1つ、エスケープシーケンスと言えば
\n:改行
\t:タブ
\":ダブルクオーテーション
あたりがよく使われるものだが、
\a:ビープ音
というのもある。
「ビッ!」という音を鳴らすんである。
処理の終わりに入れておくとよそ見していても終わったことがわかるので便利なんである。Android Linux で試してみたけど、やっぱり音は鳴らなかった。あれは確かダム端末が鳴らしていたんだよな。
今でも「\a」で音が鳴る環境ってあるのかな。
今日はここまで。
続きはまた今度。