C言語編 第5章 コメントの書き方

先頭へ戻る

このエントリーをはてなブックマークに追加

この章の概要

この章の概要です。

コメントの書き方

ソースコードを読みやすくするために、大きな助けとなるのがコメント(注釈)です。 コメントとは、ソースコードの中に記述するメモ書きのことです。 日本語で自由に記述することができ、プログラムの動作に一切影響を与えません。

コメントは、プログラムの実行には無関係であり無視されますが、より正確には、半角空白1文字に変換されます。 そのため、例えば「ret/*ここは無視*/urn」のような記述は、「ret urn」に変換されるため、 「return」にはなりません。

ある程度大きなプログラムを書くようになると、どこでどんな処理をしているのか分かりにくくなってきます。 プログラム内にコメントを入れておけば、後から処理を見直したときに、処理内容を思い出す助けになります。 また、他人がプログラムを読み解くときに、理解の助けとしてもらう意味もあります。

コメントは、/* と */という2文字の記号のペアで表現します。 この2つに挟まれた部分は、コメントになります。 例えば、次の例では3か所にコメントがあります。

/* printf関数の実験 */

#include <stdio.h>

int main(void)
{
    double pi = 3.141592;

    printf( "%f\n", pi );    /* 3.141592 を出力 */
    printf( "%d\n", pi );    /* 3 ではなく変な値が出力される */

    return 0;
}

実行結果:

3.141592
-57999238

プログラムの先頭部分には、このプログラムが何をするものなのかを記述しておくことが一般的です。 他にも、作成者の名前や、実行に際しての注意書きなどを記述することもあります。

特に学校では、コメントをたくさん入れた方が良い、という風に教えることがあるようですが、 基本的には、「当たり前のことは書かない」ようにするべきです。 例えば、先ほどの例に更にコメントを追加してみます。

/* printf関数の実験 */

#include <stdio.h>    /* stdio.h をインクルード */

/* main関数。ここから始まる */
int main(void)
{
    double pi = 3.141592;    /* 円周率を表す変数pi を double型で定義 */

    printf( "%f\n", pi );    /* 3.141592 を出力 */
    printf( "%d\n", pi );    /* 3 ではなく変な値が出力される */

    return 0;    /* main関数を終了 */
}

実行結果:

3.141592
-57999238

一見詳しくなったように見えますが、実際には理解の助けになるようなコメントは増えていません。 C言語の勉強を始めたばかりで、色々とメモを入れるという意味では、上のようなコメントの書き方をしてもいいですが、 この程度のメモが不要になるぐらい、C言語を理解してきたら、こういうコメントはばっさりとカットしてしまって下さい。 コメントは、プログラムを解読するための助けであって、たくさん書いて自己満足するためのものではありません。

余計なコメントが多いことの問題の1つに、実際に行うべき処理を記述したソースコードと、 コメントとの整合性を保つ労力が増大するという点があります。
ソースコードは後から何度も修正を繰り返す可能性があります。 そのとき、その修正に追従してコメントを書き変えないと、コメントの内容が、嘘の情報になってしまいます。

コードを無効化するために使う

コメントになった部分は、プログラムの実行に影響を与えないので、一時的にコードの一部分を無効化するために使うことがあります。 このように、処理の一部を無効化することを、コードをコメントアウトする、ということがあります。

/* printf関数の実験 */

#include <stdio.h>

int main(void)
{
    double pi = 3.141592;

    printf( "%f\n", pi );
/*  printf( "%d\n", pi ); */

    return 0;
}

実行結果:

3.141592

2つ目の方の printf関数をコメントアウトしたので、この部分は実行されなくなりました。 いらなくなった処理を無効化する際、実際にソースコードの一部分を消してしまうと、当然、元に戻すことができなくなります。 コメントアウトであれば、一応、コメントとして残っているので、後から簡単に復元できます。
ただ、コメントアウトされたコードばかりが大量に残っていると、見通しが悪くなります。 復元の可能性がほとんど無くなった段階で、綺麗に削除してしまった方が良いかも知れません。

プログラムを、バージョン管理システムといったもので管理しているのであれば、以前の状態に戻すことは容易なので、 基本的に、いらないものは消しておいた方が良いです。 バージョン管理システムについては、C言語の話題とは直接関係ないので、ここでは特に触れませんが、 プログラミングをするにあたっては重要なツールですので、本格的にプログラミングを行うようになったら、 導入することをお勧めします(学習段階でも十分価値があります)。

コメントのネスト

ある構造の内側に、同じ形の構造が入っているような状態を、ネスト(入れ子)と言います。 コメントの場合、/* ~ */ の内側に、更に /* ~ */ が入っているような形は、コメントがネストしているといえますが、 これは許されません。

#include <stdio.h>

int main(void)
{
    /*
        コメント1
        /*
            コメント2
        */
        コメント3
    */

    return 0;
}

コメントの部分は色を変えて表現していますが、このように、最初に現れる /* と */ とで1つのコメントとして扱われます。 そのため、2つ目の /* は、コメントの内側にあるただの2文字に過ぎません。 そして、最後の */ が余ってしまい、不正な文字があるとみなされて、コンパイルエラーになります。

C99 (//形式のコメント)

C99 からは、コメントを // という記号で記述できるようになりました。

// によるコメントは、「//」から、その行の行末までをコメントにします。 複数行をまとめてコメントにすることができませんが、いちいち終端の記号を書く必要がありません。 大抵のコメントは1行で完結するので、入力の手間を減らすことができます。 そのため、// が使えるのなら、こちらを使うことが好まれると思います。

#include <stdio.h>

int main(void)
{
    // コメント

    return 0;
}


練習問題

問題① main関数をコメントアウトするとどうなるでしょう。

問題② 次のプログラムをコンパイルするとエラーになるでしょうか?(まず考えてから、試して下さい)

int main()
{
    /*
    int num = 100;
        /*
        */
    /*/
    printf( "%d\n", num );
    */
    return 0;
}


解答ページはこちら

参考リンク

更新履歴

'2018/1/30 全面的に文章を見直し、修正を行った。
コードを無効化するために使う」「コメントのネスト」の項を追加し、 解説内容を分離した。

'2018/1/5 Xcode 8.3.3 を clang 5.0.0 に置き換え。

'2017/7/30 clang 3.7 (Xcode 7.3) を、Xcode 8.3.3 に置き換え。

'2017/3/25 VisualC++ 2017 に対応。

'2016/10/15 clang の対応バージョンを 3.7 に更新。

'2015/10/12 clang の対応バージョンを 3.4 に更新。

'2015/9/5 VisualC++ 2012 の対応終了。

'2015/8/18 VisualC++ 2010 の対応終了。

'2015/8/15 VisualC++ 2015 に対応。

'2014/10/18 clang 3.2 に対応。

'2014/2/1 VisualC++ 2013 に対応。

'2014/1/14 VisualC++ 2008 の対応終了。

'2014/1/10 clang 3.0 に対応。
//コメントの例の中で、C++ の標準ヘッダが include されていたのを修正。

'2013/4/14 //コメントについて、C99 の機能としてまとめた。

'2009/3/19 文章一部修正。追記。

'2009/3/7 「この章の概要」を追加。

'2008/11/9 新規作成。



前の章へ

次の章へ

C言語編のトップページへ

Programming Place Plus のトップページへ