コメント(// と /* */)
『C言語』のコメントは『/* */』によるブロックコメントと、C99以降で使える『//』による一行コメントの2種類があります。コメントはプリプロセッサが処理する段階で空白1文字に置き換えられるため、プログラムの動作には影響しません。
構文
/* ブロックコメント — /* から */ までの範囲がコメントになります。 複数行にわたるコメントを書くときに使います。 */ int x = 10; /* 行末コメントとしても使えます */ // 一行コメント — // から行末までがコメントになります(C99以降)。 int y = 20; // 変数 y に 20 を代入します /* * 関数やファイルの説明は /* */ で書くのが慣習です。 * アスタリスクを行頭に揃えると視認性が高まります。 */
コメントの種類
| 種類 | 書き方 | 概要 |
|---|---|---|
| ブロックコメント | /* テキスト */ | 『/*』から『*/』まででコメントになります。C89/C90から使えます。複数行にわたる説明や、コードのまとまりをコメントアウトするときに使います。 |
| 一行コメント | // テキスト | 『//』から行末までがコメントになります。C99以降の仕様に含まれています。コードの右側に短い補足を添えるときによく使います。 |
コメントを書くべき場所・書かなくてよい場所
| 判断 | 場面 | 理由 |
|---|---|---|
| 書くべき | 「なぜこう実装したか」の理由 | コードを読むだけではわからない設計意図やトレードオフを残しておくと、将来の自分や他の開発者が助かります。 |
| 書くべき | 複雑なアルゴリズムや計算式 | 何をしているか一見でわかりにくい処理には、動作の概要を補足します。 |
| 書くべき | 公開APIや再利用する関数 | 引数・戻り値・副作用を記述しておくと、呼び出し側の理解が容易になります。 |
| 書くべき | デバッグ中の一時的な無効化 | コメントアウトした理由や期限を残しておくと、後で削除し忘れるリスクが減ります。 |
| 書かなくてよい | コードを読めば明らかな処理 | 『/* i に 1 を加算する */』のような自明な説明はノイズになります。変数名・関数名をわかりやすくすれば不要になります。 |
| 書かなくてよい | 変更履歴・削除したコード | バージョン管理(git)があるため、コメントに古いコードや変更日を残す必要はありません。 |
サンプルコード
comment_basic.c
/*
* comment_basic.c — C言語のコメント構文の基本的な使い方です。
* コンパイル: gcc -std=c99 -o comment_basic comment_basic.c
*/
#include <stdio.h>
/* 配列の要素数を定数として定義します */
#define ITEM_COUNT 3
int main(void) {
/* 商品名と価格を並行して管理します */
const char *items[ITEM_COUNT] = {"widget", "gadget", "device"};
int prices[ITEM_COUNT] = {1200, 3500, 800};
int total = 0; // 合計金額(税抜)
// 各商品の価格を合計します
for (int i = 0; i < ITEM_COUNT; i++) {
printf("%-10s %5d yen\n", items[i], prices[i]);
total += prices[i];
}
printf("----------\n");
printf("Total %5d yen\n", total);
return 0;
}
同じ処理を次のようにも書けます。
$ gcc -std=c99 -o comment_basic comment_basic.c && ./comment_basic widget 1200 yen gadget 3500 yen device 800 yen ---------- Total 5500 yen
comment_function.c
/*
* comment_function.c — 関数にコメントを付ける慣習的なスタイルです。
* コンパイル: gcc -std=c99 -o comment_function comment_function.c
*/
#include <stdio.h>
/*
* calculate_average — 整数配列の平均値を計算して返します。
*
* 引数:
* values — 対象の整数配列
* count — 配列の要素数(1以上)
*
* 戻り値:
* 平均値(double)。count が 0 の場合は 0.0 を返します。
*/
double calculate_average(const int *values, int count) {
if (count <= 0) {
return 0.0; /* 0除算を防ぐための早期リターン */
}
int sum = 0;
for (int i = 0; i < count; i++) {
sum += values[i];
}
/* キャストで整数除算を避けます */
return (double)sum / count;
}
int main(void) {
int scores[] = {85, 92, 78, 95, 60};
int n = 5; // 要素数
double avg = calculate_average(scores, n);
printf("Average score: %.1f\n", avg);
return 0;
}
同じ処理を次のようにも書けます。
$ gcc -std=c99 -o comment_function comment_function.c && ./comment_function Average score: 82.0
comment_debug.c
/*
* comment_debug.c — ブロックコメントによるコードのコメントアウトです。
* コンパイル: gcc -std=c99 -o comment_debug comment_debug.c
*/
#include <stdio.h>
int main(void) {
int value = 42;
/* デバッグ中: 中間値の確認(確認後に削除します)
printf("DEBUG: value = %d\n", value);
*/
// TODO: バリデーション処理を後で追加する
if (value > 0) {
printf("value is positive: %d\n", value);
}
return 0;
}
同じ処理を次のようにも書けます。
$ gcc -std=c99 -o comment_debug comment_debug.c && ./comment_debug value is positive: 42
よくあるミス
ブロックコメントをネストする
C言語のブロックコメントは入れ子にできません。『/*』の中に『/*』を書いても、最初の『*/』でコメントが閉じてしまいます。すでに『/* */』が含まれるコードブロックをまとめてコメントアウトしたい場合は、条件コンパイル(『#if 0』)を使うのが一般的です。
/* 外側 /* 内側 */ これ以降がコードとして解釈される — NG */ #if 0 /* すでにコメントがある行 */ int x = 10; /* 既存コメント付きのコード */ int y = 20; #endif /* 上の #if 0 〜 #endif が「コメントアウト」の代わりになります */
C89環境で // コメントを使う
『//』による一行コメントはC99以降の仕様です。C89/C90のみをサポートするコンパイラ環境ではコンパイルエラーになります。組み込み系などで古いコンパイラを使う場合は『/* */』のみを使います。コンパイル時に『-std=c99』や『-std=c11』を明示することで意図を明確にできます。
概要
C言語のコメントは『/* */』と『//』の2種類です。『/* */』はC89から使え、複数行の説明や関数ヘッダに向いています。『//』はC99で標準に取り込まれ、コードの右側に短い補足を添えるときによく使われます。ブロックコメントは入れ子にできない点に注意が必要で、既存コメントを含むコードをまとめてコメントアウトしたい場合は『#if 0 〜 #endif』を使う慣習があります。コメントは「何をしているか」ではなく「なぜそうしているか」を書くと効果的です。コードを読めば明らかな処理を逐一コメントで説明するのはノイズになります。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。