インデントと{}の位置(コーディングスタイル)
とはいえ全く自由に空白や改行を入れるとプログラムが読みにくくなるので、ある程度のルールを設けるべきです。特に問題になるのは「インデントの入れ方」と「中括弧{}の位置」です。
このインデントと{}は特にこうでなければならないというのが有るわけではないのですが、この講義の資料では以下のルールに従っています。
インデント幅は4にします(空白文字4文字を基本にします)。インデントの段数が多くなる場合は2にすることもあります。
中括弧の位置はK&Rスタイルに準じます。
学生の皆さんも課題として提出するプログラムは見やすくなるようインデントするようにして下さい。中括弧の位置は統一されていればどのようなスタイルでも構いませんが、以下を参考に自分の好みのスタイルを用いるようにして下さい。
インデント
インデント(indentation)とは字下げのことで、プログラムを見やすくするため、(分岐などがない)一連の文の固まりを出来るだけ縦に並ぶように同じインデント幅で揃えるようにすることです。インデントは原則として複合文(ブロック)になる場所でインデント幅を増やすように付けます(このことを単に「字下げする」「インデントする」と言います)。複合文でなくとも、if文の制御式の後ろの文やelse節のようには改行してインデントするべきです。
ということで原則は「中括弧{が現れたら改行して一段インデントする」「複合文の終わりの中括弧}は一段インデントの段数を減らしてから書き改行する」です。
code:test.c
// インデントがされていない悪い例
int main(void)
{
int i=0;
scanf("%d",&i);
if (i % 2) puts("奇数"); else puts("偶数");
return 0;
}
これは
code:test.c
// インデントを行った例(if後/else節の文は複合文にしています)
int main(void)
{
int i = 0;
scanf("%d", &i);
if (i % 2) {
puts("奇数");
} else {
puts("偶数");
}
return 0;
}
このようにするべきです。
インデントに使う文字にもいくつかの流儀があります。かつてはインデントは水平タブ文字(ASCIIコード0x09、Cでは'\t')を使うものとされてきました。エディタなどの機能により、水平タブ文字があると次のタブ位置(通常は8の倍数の桁位置だが最近は細かくインデントする言語が増えたので4の倍数や2の倍数が好まれる傾向にあります)まで右方向に空白を開けてくれるからです。ですがこれだとエディタの設定によりタブ位置が違うことになってしまうので、最近はエディタの機能で必要数の空白文字(スペース)を自動的に入れてくれる場合も増えてきました。皆さんにお勧めしているVisual Studio Codeでもそうなります。
なおVisual Stuidio Codeでは複数の行のインデントを一気に揃えたりする機能が備わっているので活用して下さい。タブ幅が揃っていない複数の行を選択して(SHIFT+カーソルキーで選択できます)Tabキーを押すとインデントを揃えてくれます。
https://i.gyazo.com/01da1f961739bb141b8be4df2ed6dd55.gif
そのままTabキーを複数回押すとインデント幅が増えてゆきます。インデント幅を減らすにはSHIFTを押しながらTabキーを押します。
中括弧{}の位置
Cソースプログラムはインデントをするべきであるということについては多くの人は異論ないようなのですが、中括弧の位置がどこであるべきかは多くの議論があります。このような中括弧の位置も含めたインデントのルールを字下げスタイルまたはインデントスタイル(Indentation style)と呼びます。これは完全に好みの問題で、何か正解があるわけではないですが、統一しておいた方がプログラムの読みやすさは増します。ここで多くの人が使っているスタイルをご紹介します。 K&Rスタイル
Visual Studio CodeのC/C++拡張では、標準では自動的にK&Rスタイルでプログラムを整形してくれる機能があります。プログラムの該当部分を選んで右クリックし、「ドキュメントのフォーマット」(英語表記の場合はFormat Document)を選択すれば(標準設定では)K&Rスタイルに沿った整形をしてくれます。
https://i.gyazo.com/7b4bd03ba9c92e536016f83da92022ce.gif
Javaスタイル(Googleスタイル)
世の中にはK&Rスタイルのうち、関数の直後だけ中括弧 { が独立しているのを嫌って、関数名の直後に { を書くように変形したルールを使う人がいます。つまり
code:c
int main(void) {
printf("Hello, World\n");
}
と書くべきという意見です。Cの影響を受けた言語であるJavaやJavaScript (ECMAScript)ではこの記法が主流であるため、この字下げスタイルを特にJavaスタイルと呼ぶ人もいます。Googleは社内で使っているC/C++のインデントスタイルをこれにしているため、Googleスタイルと呼ぶ人もいます。 Visual Studio Codeでこれを使いたければ、C/C++拡張の設定のうちClang_format_styleを"Google"に設定しましょう。こうすることで上記の「ドキュメントのフォーマット」でGoogleスタイルで整形されるようになります。(なお既定はfileとなっていますが、これがいわゆるK&R形式のようです)
https://gyazo.com/1b2b4bde562ba601c92da549d5a44ccf
Allmanスタイル(BSDスタイル)
この他のスタイルとしてブロック開始の中括弧 { を常に独立した行に置くスタイルもあります。これを始めたエリック・オールマン(Eric Allman)の名前をとってAllmanスタイルと呼びます。また彼の影響を受けてUNIXの重要な派生であるBSDのツール群のソースプログラムにおいて広まったことから、BSDスタイルとも呼ばれます。Allmanスタイルではプログラムはこんな感じになります。 code:c
int main(void)
{
int i = 0;
printf("整数を入力してください:");
scanf("%d", &i);
if (i % 2)
{
puts("奇数です");
}
else
{
puts("偶数です");
}
return 0;
}
Visual Studio Codeでは、上記のClang_format_styleを"Visual Studio"とするとほぼAllmanスタイルになります。
GNUスタイル
GNUスタイルは、GNUのツール群のソースプログラムで使われているスタイルで、中括弧を独立させるだけではなくインデント幅を敢えて半分にするというスタイルです(例えばgcc自身のソースコードはGNUスタイルで書かれています)。また、関数の先頭にある型名も独立した行に書くという特徴があります。 GNUスタイルの例は以下の通りです。
code:c
int
main (void)
{
int i = 0;
printf ("整数を入力してください:");
scanf ("%d", &i);
if (i % 2)
{
puts ("奇数です");
}
else
{
puts ("偶数です");
}
return 0;
}
Visual Studio Codeでは、上記のClang_format_styleを"GNU"とするとGNUスタイルになります。
これらのインデントスタイル(や、それを含むコーディングスタイル)は、どれも一長一短なのでどれが正しいというものではありません。ですが大切なことは、特に複数の人間が扱うようなプログラムに於いてはコーディングスタイルを統一しないと混乱すると言うことです。みなさんも研究室配属された後、研究室の他のメンバーと共同でプログラミングすることがあると思いますが、このようなコーディングスタイルは事前に統一することを決めておいた方が良いでしょう。