i
e j
costumam ser usados como subscritos em um pouco de matemática há algum tempo (por exemplo, mesmo em trabalhos anteriores a linguagens de alto nível, você costuma ver coisas como "X i, j ", especialmente em coisas como um somatório).
Quando eles projetaram o Fortran, eles (aparentemente) decidiram permitir o mesmo; portanto, todas as variáveis que começam com "I" a "N" são padronizadas para inteiro e todas as outras reais (ponto flutuante). Para quem perdeu, esta é a fonte da velha piada "Deus é real (a menos que seja declarado inteiro)".
A maioria das pessoas parece ter visto poucas razões para mudar isso. É amplamente conhecido e compreendido, e bastante sucinto. De vez em quando você vê algo escrito por algum psicótico que acha que há uma vantagem real em algo como:
for (int outer_index_variable=0; outer_index_variable < 10; outer_index_variable++)
for (int inner_index_variable=0; inner_index_variable < 10; inner_index_variable++)
x[outer_index_variable][inner_index_variable] = 0;
Felizmente, isso é bem raro, e a maioria dos guias de estilo agora indica que, embora nomes extensos e descritivos de variáveis possam ser úteis, você nem sempre precisa deles, especialmente para algo assim, onde o escopo da variável é apenas uma ou duas linhas de código .