演算子とは、+ や - といった計算式に用いられる記号を表します。分かりやすいのは5 + 10のような簡単な計算式です。この場合、定数5と10を加算することを表す + 記号が演算子となります。これまでのサンプルでは計算式を書いていませんが、実は printf()関数の呼び出しに使っていた対になっている ( ) は演算子に該当します。この演算子は、関数を実行するという作用を持ちます。

区切り子は、構文上の意味しか持たず、演算子のような作用を持たない記号を表します。main() 関数の小かっこ ( や ) 、中かっこ { や } は区切り子に該当します。

上記の字句のうち、演算子と区切り子は字句を区切る性質を持ちます。例えば、次の計算式

5 + 10

は、定数と演算子の間にスペースがありますが、スペースがなくても演算子で字句を区切ることができるため、次のように書いても問題はありません。

5+10

Sample01 のソースコードを、字句単位に分解し、字句を次のように分類できます。

表01 字句の分類

字句 種類
int キーワード
main 識別子
( 区切り子
void キーワード
) 区切り子
{ 区切り子
printf 識別子
( 演算子
"Kitty on your lap\n" 文字列リテラル
) 演算子
; 区切り子
return キーワード
0 定数
; 区切り子
} 区切り子

このように、コードを字句単位に分解して考えられるようになれば、ミスを発見しやすくなるでしょう。

逆に考えれば、字句さえ正しく分解できれば、自由に空白や改行を入れることができます。次のソースコードは Sample01 を崩したものですが、字句の並びが同じなので正しくコンパイルできます。

Sample03

#include <stdio.h>

int
main    (void
) {printf
("Kitty on your lap\n"); return
0;}

実行結果

Kitty on your lap

Sample03の実行結果

見た目はSample01と異なりますが、字句に分解してみれば、全く同じコードであることが分かります。

これまで、main()関数の内のコードをタブでインデントしていたのは、単にコードを読みやすくするための配慮です。Sample03のように、字句が正しく区切られていれば必須のものではありませんが、誰が見てもSample03よりSample01の方が読みやすいでしょう。多くの慣れているプログラマは、何らかの中に含まれるコードを単位にインデントを深くします。