「インデント」とは、「字下げ」といいます。
これまでもずっと使っているのですが、どこに使っているのでしょう。
<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が自動的に入れてくれるのに、なぜこのようなエラーが発生するかと言いますと、プログラムを作っている最中に追加したり、削除したりしていると、どんどんインデントが崩れていきます。
プログラムを追加・削除した場合は、インデントの確認をすぐにしておきましょう。
ブラウザの戻るボタンで戻ってください。