Cのプログラムをよく眺めてみると、同じことをするプログラムでも、書き方が人によって少しずつ異なっていることが分かります。
例えば、あるHello Worldプログラムを見てみましょう。これは、PleiadesでHello Worldプロジェクトを作ったときに生成されるコードから、コメントを除いたものです。
#include <stdio.h> #include <stdlib.h> int main(void) { puts("!!!Hello World!!!"); return EXIT_SUCCESS; }
よく見ると、いくつかスペースやタブが入っていることが分かります。「int」と「main」の間にはスペースが入っていますし、「main(void)」と「{」の間にもスペースが入っています。「{」のうしろには改行があって、「puts」の手前にはタブが入っています。
実は、これらのスペースやタブは、Cプログラムにとって必要なものと、そうではないものがあります。
なくても構わないものは、もしそれがなくてもプログラムはコンパイルできますし、実行にも問題がありません。ただ、読みやすくするために入っているだけです。
しかし、必要なスペースやタブをなくしてしまうと、コンパイルエラーになります。
なぜこのようになっているかを知るためには、コンパイラが行っている「字句解析」という処理について知る必要があります。字句解析とは、文字の並びを意味のある単位に分けることをいいます。
といっても、それほど難しいことはありません。Cコンパイラが処理する字句とは次の物を指します。
C99のキーワードは37個の種類があり、その中には連載のこれまでの記事では説明していないものもあります。すでに説明したものでキーワードに相当するものとして、intやdoubleといった型名や、sizeof演算子、typedefがあります。
Cコンパイラが備える字句解析は、これらのものがソースコード中に現れると、それぞれを字句として分割していきます。文脈から明らかに字句として分けられるものは、スペースがなくても分けてくれます。
ところが、もし「int main」にスペースがなかったら「intmain」となりますが、これを「int」と「main」に分ける、ということは行われません。「intmain」という、1つの字句として解釈されます。なぜなら、「intmain」という文字列は、字句の1つである識別子として解釈することが可能だからです。
逆に字句の分かれるところにはスペースを入れることができます。「main(void)」は「main ( void )」と書いても問題ありません。スペースがあってもなくても、同じように字句解析が行われます。
このようなルールで字句解析が行われますが、Cプログラムの字句はスペースや記号という直感的に分かりやすいところで分割されますので、字句解析のルールがあまりよく理解できなくても違和感なく読めると思います。もちろん、理解できていればさらにスムーズに読み書きできるでしょう。
ちなみにスペースを入れることができるところには、スペースをいくつ書いてもかまいません。さらには、スペースの代わりにタブや改行を入れることもできます。これらを駆使することで読みやすいプログラムを書くことができます。
自分一人でプログラムを書いていると、正しいのか間違っているのか、あるいは見当違いのことをやっているのか、分からなくなることがあります。まわりに聞ける人がいるときには、素直に聞いてみましょう。
聞ける人がいないときには、インターネットでほかの人が書いたプログラムがどうなっているか探してみましょう。Webにはさまざまなソースコードが公開されていますが、ここではそれらをまとめて検索してくれるGoogleソースコード検索を紹介しておきます。
「http://www.google.com/codesearch」にアクセスして、検索ボックスに何かキーワードを入れてみましょう。ただしそのままでは、ほかの言語のソースコードも一緒に出てきてしまいますので、検索キーワードと一緒に「lang:c」と指定します。これでCで書かれたソースコードだけが表示されます。ただし、お手本としたいソースコードと、そうでないソースコードがあります。もちろん、見分けることは難しいのですが、有名で更新が頻繁にされているオープンソースソフトウェアのコードであれば、お手本として良いと筆者は考えています。1つの目安程度にしかなりませんが、参考にしてください。
基本をきちんと押さえることと、たくさんのコードに触れることが上達の近道です。ほかにもWebにはたくさんのソースコードがありますので、連載のお供にしてみてください。
Copyright © ITmedia, Inc. All Rights Reserved.