コメントは何のためにあるか
コメントとは、C++コンパイラが完全に無視する、ソースコード内のテキストです。コンパイルされたプログラムには一切到達せず、コードを読む人間のためだけに存在します。コメントは、なぜ何かが特定のやり方で行われているのかを説明するため、メモを残すため、あるいはコードを削除せずに一時的に無効化するために使います。
すでに知っているC++の構文を土台にすると、コメントはほぼどこにでも置けて、コンパイラが単に読み飛ばしてくれる数少ないものの1つです。C++には2種類あります。1行コメント (//) と複数行のブロックコメント (/* */) です。
1行コメント
2つのスラッシュ (//) は、現在の行の終わりまで続くコメントを開始します。コンパイラは // から改行までのすべてを読み飛ばします。
2つ目のコメントが実際のコードと同じ行を共有していることに注目してください。// の前にあるものはすべて実行され、その後ろの部分だけが無視されます。これは短いメモに最もよく使われるコメントスタイルです。
複数行のブロックコメント
メモが数行にわたる場合、各行に // を付けるよりブロックコメントの方がすっきりします。ブロックコメントは /* で始まり */ で終わります。その2つの間にあるものは、何行あってもすべて無視されます。
先頭の縁にそろえられた * 文字はスタイルの慣習であって、ルールではありません。実際に意味を持つのは、開始の /* と終了の */ だけです。ブロックコメントは行の途中に置くことさえできます - int x = 5 /* width */ + 2; は有効です - もっとも、それはすぐに読みにくくなります。
コードのコメントアウト
コメントは、試行錯誤の最中にコードを削除せず無効化する標準的な方法です。1行なら // を、複数行をまとめてオフにするならブロックコメントを使います。
実行すると、表示されるのは2つの「runs」の行だけだとわかります。コメントアウトされた cout 文はコンパイラからは見えません。
ネストできないという落とし穴
初心者がはまる罠: ブロックコメントはネストできません。前にいくつ /* があっても、最初の */ がコメントを閉じます。そのため、/* ... */ ブロックを別の /* ... */ ブロックの中に入れることはできません。内側の */ で全体が終わってしまい、その後ろは再びコード(たいていは構文エラー)になります。
/* Trying to disable a region that already has a block comment...
int n = 10; /* the width */
cout << n;
*/ // the first */ above already closed the comment - this line is now stray code
外側のコメントは the width の後ろの */ で終わるので、残りはもはやコメントアウトされておらず、末尾の */ でコンパイラが詰まります。すでにブロックコメントを含む範囲を無効化する必要があるときは、代わりに各行に // を使ってください。ほとんどのエディタは、キーボードショートカット1つで選択範囲全体の行コメントを切り替えられるので、この問題を完全に回避できます。
良いコメントとノイズ
コメントは、コードがそれ自体では語れないことを説明すべきです。単にコードを言い換えるだけのコメントは雑然とした印象を生み、コードが変わるにつれて古びていきがちです。
// Bad: just repeats what the code obviously does
i = i + 1; // add one to i
// Better: explains the reason, which the code can't show
retries++; // back off and retry; the API is rate-limited at 5 req/sec
明確な名前と構造によってコードそのものを読みやすくすることを目指し、コメントはなぜに取っておきましょう - 意図、トレードオフ、エッジケース、そして背景へのリンクです。分かりにくい1行を説明するためにコメントを書いている自分に気づいたら、それはたいてい、変数の名前を変えるか、ロジックを適切な名前の関数に分割すべきというサインです。
次: 変数
これでコードに注釈を付けられるようになったので、次の構成要素はそこにデータを保存することです。次のページでは変数を扱います - 変数の宣言の仕方、変数が保持する組み込み型、そしてC++が静的型付け言語であるがゆえに課すルールについてです。
よくある質問
C++でコメントはどう書きますか?
1行コメントには // を使います。その行で // 以降に書かれたものはすべてコンパイラに無視されます。複数行にわたるコメントには、テキストを /* と */ で囲みます。例えば // これはメモです や /* これは 複数行にわたります */ のように書きます。
C++で // と /* */ の違いは何ですか?
// は1行の残りをコメントアウトするので、各行に1つ必要です。/* */ はブロックコメントで、/* から始まり、複数行にまたがっていても次の */ まで続きます。短いインラインのメモには // を、まとまったテキストやコードを一度に無効化するには /* */ を使いましょう。
C++でコメントをネストできますか?
いいえ。ブロックコメント (/* */) はネストできません。前にいくつ /* があっても、最初の */ がコメントを閉じます。すでにブロックコメントを含む範囲を無効化するには、代わりに各行に // を付けてください(ほとんどのエディタはショートカット1つでこれを行えます)。