インデンテーションについての約束事


チームでプログラムを作成する場合、メンバーがプログラムを読み易いように、 インデンテーション(字下げ)に関して一定のルール(約束事)を設ける。

Visual Studio Code による自動整形

Visual Studio Code (VSC) にも自動的にインデンテーションする機能 (右クリックして「Format Document」あるいは Shift+Alt+F)がある。 ただし、VSC の自動インデンテーションのデフォルトの設定は、 特に開きブレースの位置が以下に挙げる約束事とは異なる。

そこで開きブレースの位置を変えるために、setting.json に次の項目を追加する。

"C_Cpp.clang_format_style": "{BasedOnStyle: Google, IndentWidth: 4}", 

つまり Ctrl-, (Mac では command-,)で「設定」(Settings) というタブを開き、「設定の検索」(Search settings) に「C_Cpp.clang_format_styleと入力して、 見つかった項目を(はじめは「file」になっているはずだが、これを消して)「{BasedOnStyle: Google, IndentWidth: 4, UseTab: Never} に変更する。これでこのページに挙げる約束事とほぼ一致するインデンテーションになる。

(すこし長いが「{BasedOnStyle: Google, IndentWidth: 4, UseTab: Never, AllowShortBlocksOnASingleLine: Empty, AllowShortCaseLabelsOnASingleLine: true, AllowShortIfStatementsOnASingleLine: WithoutElse, AllowShortLoopsOnASingleLine: false, AllowShortFunctionsOnASingleLine: Empty, BreakStringLiterals: false} とすると、さらに約束事のなかの例外的事項にも対応する。)

(2023/11/15) BreakStringLiterals: false を追加
(2023/11/29) AllowShortLoopsOnASingleLine: false に変更 (2023/12/20) AllowShortFunctionsOnASingleLine: Empty を追加

Visual Studio Code のデフォルトの文字コードの変更

インデンテーションと関係ないが、設定のついでに、デフォルトの文字コードも変更しておこう。

やはり Ctrl-, (Mac では command-,)で「設定」(Settings) というタブを開き、 「設定の検索」(Search settings) に「Files: Encodingと入力して、見つかった項目を「UTF-8 with BOM」に変更する。

「プログラミング」では、 課題で提出するプログラムのインデンテーションに関して次のような約束事を採用する。 (5番目の約束事以外は、 教科書で採用されている約束事と概ね同じである。)

  1. 原則として、一行には文は一つしか書かない。 ただし、次の例のように密接に関連している文の場合はこの原則にこだわる必要はない。

  2. ブレース({})の中の文は、外よりも 4 または 8 字分を字下げする。 ただし、首尾一貫した文字数であれば、4 や 8 という数字にこだわる必要はない。(ただ、1 字は少なすぎる …)

    良い悪い悪い
    if (n1 > n2) {
        max = n1;
        min = n2;
    } 
    
    if (n1 > n2) {
    max = n1;
    min = n2;
    } 
    
    if (n1 > n2) {
        max = n1;
            min = n2;
    }
    
  3. 一つのファイルで空白文字とタブ文字を混ぜない。 (タブ文字を使わずに空白文字だけで字下げする。 あるいは空白文字を使わずにタブ文字だけで字下げする。)

    同じ文字列でも… タブサイズ 4 の場合
    (Notepad ++, サクラ など)
    タブサイズ 8 の場合
    (ブラウザーのデフォルト、メモ帳、Emacs など)
    int main(void) {
    		printf("hello");
            printf("hello");  
    	    return 0;
    }
    
  4. 開きブレース({)は ifelse, switch, do, while, for などのキーワードと 同じ行に改行せずに書く。開きブレースのあとは何も書かず改行する。

    良い悪い悪い
    if (n1 > n2) {
        max = n1;
        min = n2;
    }
    
    
    if (n1 > n2) 
    {
        max = n1;
        min = n2;
    } 
    
    if (n1 > n2) { max = n1;
        min = n2;
    } 
    
    
    
  5. 閉じブレース(})は対応する ifswitch, do, while, for などのキーワードのはじめの文字と列をそろえて書く。 その行には閉じブレース以外には何も書かない。

    良い悪い悪い
    if (n1 > n2) {
        max = n1; 
    } else {
        max = n2; 
    } 
    
    if (n1 > n2) {
        max = n1; 
        } else {
        max = n2; 
        } 
    
    if (n2 > max) {
        max = n2; 
    } if (n3 > max) { 
        max = n3; 
    }
    
  6. (鉄の掟) if 文, ifelse 文 や for 文, while 文, dowhile 文などでは、 選択されたり、繰り返したりされる文が一つだけの場合も、 ブレース({})に囲む。

    この約束事だけは、 教科書のプログラム例は必ずしも従っていないので、 特に注意する。(教科書 p.61 の ▶ の部分を参照)

    良い悪い
    if (n >= 60) { 
        count++;
    }
    
    if (n >= 60)
        count++; 
    
    
    if (n1 > n2) { 
        max = n1;
    } else {
        max = n2;
    }
    
    if (n1 > n2)
        max = n1; 
    else 
        max = n2; 
    
    
    while (n1 < n2) { 
        printf("%d ", n1++);
    }
    
    while (n1 < n2)
        printf("%d ", n1++);
    
    
    for (int i = 0; i < n ; i++) { 
        printf("%d ", i);
    }
    
    for (int i = 0; i < n ; i++)
        printf("%d ", i);
    
    
    do { 
        printf("%d ", i++);
    } while (i < n);
    
    do
        printf("%d ", i++);
    while (i < n);
    
  7. 関数の定義は1列めから書きはじめる。 関数本体の開始を表す開きブレース({)は、関数頭部のあとに続けて改行せずに書くか、 改行して 1 列めに書く。 関数本体の最後を表す閉じブレース(})は、1 列めに書く。

    良い良い悪い
    int main(void) {
        printf("hello\n");
        return 0;
    }
    
    
    int main(void) 
    {
        printf("hello\n");
        return 0;
    }
    
    int main(void) 
        {
        printf("hello\n");
        return 0;
        }
    

例:

(コメントの中の数字は、上記の約束事の番号)


Koji Kagawa