

ループの変数名で好んでi,j,...が使われる理由はなんですか  
デフォルト？国際的な決まり？

[code]

    for(int i=0;i<N;i++);
    
[/code]


CC BY-SA 3.0
2015-07-31T20:56:45.987
12895
2015-08-01T23:06:08.193
10749
question
c++ c
ループの変数名で好んでi,j,...が使われる理由はなんですか


整数にあたる英語integerのiから順に使用しています。またiはindexの頭文字でもあり、数学のΣ記法などでも変数にi,j,kを使用することが多いです。


CC BY-SA 3.0
2015-07-31T21:04:53.960
12896
2015-07-31T21:11:15.693
2015-07-31T21:11:15.693
5750
5750
12895
answer


ループ用の変数というのは  
\- 整数型を使うべし (浮動小数点数型を使ってはならない)  
\- 局所変数にすべし  
\- 故意に短い名前にすることでループ回数保持用の変数だとわかりやすくしろ  
という暗黙の合意があります。

どちらが先なのかは意見が分かれるところですが  
\- [fortran](/questions/tagged/fortran "'fortran' のタグが付いた質問を表示") 66
では変数名の先頭１文字が IJKLMN である変数は暗黙に整数型  
\- 整数型なので (この名前を) ループ回数保持に使う  
というあたりから i j k という名前をループ用変数にする、という慣習があります。

i を採用したのは index なり integer なりの先頭文字だから、でほぼ間違いないでしょう。

明文化された「決まり」は無いようです。  
単なる慣習ですが、慣習には従っておくほうが可読性が増してよい感じです。


CC BY-SA 3.0
2015-08-01T21:38:32.157
12933
2015-08-01T21:38:32.157
8589
12895
answer


おそらく数学で添字に`i`,`j`,`k`...を使うことに由来しており、そこからプログラミングへと輸入されてそのような慣習が広く受け入れられています。そのような規約などがあるわけではないので、別に従う必要はありません。

プログラミング言語の記法は、添字以外にも大半の記法が数学に由来しています。例えば、関数適用で`f(x)`のように引数に括弧をつけるのももちろん数学からです。数学でもすでに同じ記法が広く使われているのに関わらず後発のFortranに由来すると考えるのも不自然ですので、個人的にはFortranに由来するとは言いがたいと思います。

これは単なる慣習ですから、理由があれば従わなくても構いません。むしろ、短いスコープに限定される一時的な変数だとしても、
**可読性のためには`i`や`j`などの変数の意味を示さない変数名よりは意味のある変数名をつけたほうが好ましい**と言えます。一文字変数を使うべきでないということはプログラミング初心者なら一度は言われたことがあるはずです。例えば、

[code]

    int i, j;
    int m[] = {0, 1, 2, 3};
    
    for(i = 0; i < 2; i++){
        for(j = 0; j < 2; i++){
            cout << m[2 * j + i] << ", ";
        }
        cout << endl;
    }
    
[/code]

この2重のforループで実は`j`と書くべきところを`i`とミスタイプしているのですが、

  * `i`と`j`があまりに似た字面なので、見た目では区別がつきにくいです
  * `i`と`j`という名前では、どちらが行のインデックスでどちらが列のインデックスなのか変数名からはわかりません
  * しかもこの2文字はキーボード上で隣り合っておりミスタイプしやすいです
  * たった１文字なのでミスタイプしてもコンパイルエラーで発見できません

とデメリットが山盛りです。意味のある変数名、例えば`rowIndex`と`columnIndex`を使えば、

[code]

    int rowIndex, columnIndex;
    int m[] = {0, 1, 2, 3};
    
    for(rowIndex = 0; rowIndex < 2; rowIndex++){
        for(columnIndex = 0; columnIndex < 2; rowIndex++){
            cout << m[2 * rowIndex + columnIndex] << ", ";
        }
        cout << endl;
    }
    
[/code]

のように見た目上でも確認しやすくなりますし、1文字くらいミスタイプしてもそのままコンパイルが通ってしまうという危険はなくなります。このような慣習が受け入れられているのは確かですが、数学はまた事情が異なるので別としても、はっきり言って
**プログラミングにおいては悪習の類**
だと思います。このような悪習に安易に従うべきではないのですが、これが致命的になることは少ないので現実にはあまり問題視されることはありません。私も悪習であると思いながらもあまり気にせず平気で`i`や`j`を使っています。几帳面な人はぜひ`i`や`j`は止めて意味のある名前を付けるのがいいと思います。


CC BY-SA 3.0
2015-08-01T23:06:08.193
12935
2015-08-01T23:06:08.193
10330
12895
answer