★インデント★


「インデント」とは、「字下げ」といいます。

これまでもずっと使っているのですが、どこに使っているのでしょう。


<sample program col007-01>

#include <stdio.h>

int main(void)
{
    printf("Hello C World\n");

    return 0;
}

最初に書いたプログラムですが、printfの左やreturnの左に空白があります。

上のサンプルでは半角空白4つを入れていますが、Visual Studioのデフォルトは「タブ文字」になっています。

「タブ文字」はキーボードの左端にある「Tab」と書かれたキーで入力できます。

これを押すと、「タブ文字」が入ります。

Visual Studioでは、初期設定が「半角空白4文字分」となっています。

Windowsに付属の「メモ帳」では、「半角空白8文字分」となっています。

「タブ文字」は設定やソフトによって変わります。

Visual Studioでは、改行すると勝手に入ります。

このインデントは何のためにあるのでしょうか。


インデントは、プログラムを読みやすくするためにあると考えてください。

C言語はフリーフォーマットと言って、下のように書いてもプログラムは動きます。

<sample program col007-02>

#include <stdio.h>
int main(void){printf("Hello C World\n");return 0;}

どうですか、極力空白やタブ、改行を無くしました。

これでも、動作します。

でも、見やすいですか?

ぱっと見て何をしているか分かりやすいですか?

長いプログラムになればなるほど、非常に分かりづらくなります。


次にこれはどうでしょう。

<sample program col007-03>

#include <stdio.h>

int main(void)
{
int input1;
int input2;
int input3;
printf("整数1を入力してください:");
scanf("%d", &input1);
printf("整数2を入力してください:");
scanf("%d", &input2);
printf("整数3を入力してください:");
scanf("%d", &input3);
if (input1 == input2) {
if (input1 == input3) {
printf("3つの数は等しいです。\n");
}
else{
printf("3つの数は異なります。\n");
}
}
else{
printf("3つの数は異なります。\n");
}
return 0;
}

個人的には、このようなプログラムは見たくありません・・・(もちろん触りたくもないです)


大分前にも書きましたが、「{」が出てきた時点で、「インデント」を入れます。

下のプログラムで確認してみてください。

<sample program col007-04>

#include <stdio.h>

int main(void)
{
    int input1;
    int input2;
    int input3;

    printf("整数1を入力してください:");

    scanf("%d", &input1);

    printf("整数2を入力してください:");

    scanf("%d", &input2);

    printf("整数3を入力してください:");

    scanf("%d", &input3);

    if (input1 == input2) {
        if (input1 == input3) {
            printf("3つの数は等しいです。\n");
        }
        else{
            printf("3つの数は異なります。\n");
        }
    }
    else{
        printf("3つの数は異なります。\n");
    }

    return 0;
}

どちらが見やすいでしょう。


インデントは時々、重要な問題を引き起こします。

次のプログラムは「特に意味のない」プログラムですが、どこが変かわかりますか。

<sample program col007-05>

#include <stdio.h>

int main(void)
{
    int data = 18;

    if (data > 10) {
        if (data < 20) {
            printf("OK\n");
        }
    else {
        printf("NG\n");
    }
    }

    return 0;
}

このプログラムは変数dataの中身が「10より大きくて、20未満」であればOKと表示し、「10より大きくて、20以上」の場合はNGと表示するプログラムです。

よく見ると「}」が立て続けに書いてある場所があります。

これは、インデントがずれている「証拠」です。

このelse文はどちらのifに対してのelse文なのでしょうか?

ifとelseはセットです。

if文の「}」のすぐ下にあるelse文が、そのif文のelse文です。

上の例を見ると、else文の直前の「}」は2番目のif文のものです。


初心者の方は、インデントを気にしません。

おかしいな?と思わないので、なぜ動かないのか、なぜエラーになるのか、が分からないのです。

気になったとしても、往々にして次のような対処をします。

<sample program col007-06>

#include <stdio.h>

int main(void)
{
    int data = 18;

    if (data > 10) {
        if (data < 20) {
            printf("OK\n");
        }
    else {
        printf("NG\n");
    }

    return 0;
}

「}」が重なっていておかしいので、1つを削除してしまいました。

コンパイルすると下記のようなエラーが表示されます。

  fatal error C1075: 左側の 中かっこ '{' に対応するものがファイルの最後まで検出されませんでした。

「{」に対応する「}」が見つかる前にEOF(ファイルの終わり:End Of File)が見つかったという意味です。

「{」を書いたら「}」が必ず必要です。

忘れていた場合「エラー」になります。

実際「エラー」を直した数だけ皆さんの力がついていきますが、エラーメッセージとエラーの内容をしっかり覚えていれば間違いが少なくなります。


上のプログラムの本来の形を書いておきます。

変数dataの中身が「10より大きくて、20未満」であればOKと表示し、「10より大きくて、20以上」の場合はNGと表示するプログラムであれば、

<sample program col007-07>

#include <stdio.h>

int main(void)
{
    int data = 18;

    if (data > 10) {
        if (data < 20) {
            printf("OK\n");
        }
        else {
            printf("NG\n");
        }
    }

    return 0;
}

となります。


インデントはVisual Studioが自動的に入れてくれるのに、なぜこのようなエラーが発生するかと言いますと、プログラムを作っている最中に追加したり、削除したりしていると、どんどんインデントが崩れていきます。

プログラムを追加・削除した場合は、インデントの確認をすぐにしておきましょう。


ブラウザの戻るボタンで戻ってください。