C/C++のソースでよく見られる1文字変数の一覧表(私案)

世の中には1文字変数という文化がある。

個人的には基本的に余り歓迎したくない類のもので、私個人の見解としてはせめて、

  1. 適用範囲が比較的小さい場合に限り、
  2. 特定の用途でのみ使用する。

という制限を付けたいと考えているものだ*1

1文字変数は、ソースコード上におけるその変数の意味を捉えるのが困難になりがちであり、乱用するとソースコードの可読性が著しく低下する。逆に言えば「その変数に明確な意味がない場合には1文字変数をそれほど問題視しなくてもギリギリセーフかも」という主張も条件次第では通るのかもしれない。

C言語の文化には比較的多くの1文字変数が見られる傾向にあると思う。私の周囲にはC言語からC++に移行したパターンの人も多いので、C++のコード上でも同様の例が見られる。

良いも悪いも含めて、書籍や私の周囲で観察できる1文字変数の例を表にしてみた。

変数名 内容
a, b 特に意味はない、適当な数値。数値演算用の関数の仮引数などで使用。
c 文字(キャラクタ)。何でもよいから兎に角1文字、な場合。
e エラー。特に例外処理のcatchで使用。
f 特に意味はない、適当な関数名/関数ポインタ名。関数名でのケースはサンプルソースのみ。関数ポインタのケースは、関数の仮引数にて稀に見られる。
i, j, k ループ処理の添字。iとjを取り違えてバグになることがある。ループが長くなる場合*2は避けるべし。
l 特に意味はない、適当な数値。long型の場合に稀に見られる。
m, n 何かしらのデータの個数。普通はnだが、複数の変数が必要な場合にmも使っていることがある。
p, q, r 適当なポインタ。汎用的な文字列/配列処理で使うことが多い。
s, t 適当な文字列。比較的汎用な文字列処理用関数の仮引数などで使用。
x, y, z 座標。
x, y, z 特に意味はない、適当な数値。数値演算用の関数の仮引数などで使用。

個人的にはc、e、iとj、pとq、s、xとy(座標)は使わなくもないが、基本的に1文字変数は避けた方が無難だと考えている。まあ、大抵はもっとよい名前があるし、多少名前が長くなってもエディタに入力補完機能があれば大丈夫だからなあ。

*1:多人数が関わるプロジェクトの場合、この辺の徹底が不十分となるに違いないので、初めから禁止した方が無難かもしれない。

*2:この「長い/長くない」の基準は揉め事になるので、限られた少人数の面子で開発及び長期間メンテを行うのでもない限り、i、j、kを添字にするのは止めた方がよい。というか数百行の2重ループのi、jの時点で私はコードを理解できなくなる。