Por que a maioria de nós usa 'i' como uma variável de contador de loop?

126

Alguém já pensou por que tantos de nós repetimos esse mesmo padrão usando os mesmos nomes de variáveis?

for (int i = 0; i < foo; i++) {
    // ...
}

Parece que a maioria do código que já olhou para os usos i, j, ke assim por diante como variáveis de iteração.

Suponho que peguei isso em algum lugar, mas me pergunto por que isso é tão prevalente no desenvolvimento de software. É algo que todos nós aprendemos no C ou algo assim?

Apenas uma coceira que tive por um tempo na parte de trás da minha cabeça.

kprobst
fonte
4
Já perguntou há muito tempo no SO; talvez esses devam ser migrados aqui: stackoverflow.com/questions/454303/… e stackoverflow.com/questions/4137785/…
BlueRaja - Danny Pflughoeft
8
É uma pergunta duplicada e eu amo esta resposta. Por causa do nome D ijk stra.
Vivart 27/06
2
Eu sempre pensei que i, j, k foi tomada a partir de D ijk stra
Christian Kjær
11
BTW: Eu sempre uso ii(e jj, kk...) para facilitar a localização durante a pesquisa.
Sabuncu 5/05
11
O que mais você usaria?
Thorbjørn Ravn Andersen

Respostas:

205

ie jcostumam 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 .

Jerry Coffin
fonte
13
+1 Eu não tinha pensado na correlação matemática aqui. Esta foi uma realização interessante.
Casey Patton
79
+1 por atribuir à psicose o que alguns imaginam ser estilo.
precisa
2
OK - então por que iej são usados ​​como subscritos em matemática? Eu acho que esse uso antecede Fortran :-) Tenho certeza Knuth sabe ...
Guy Sirton
34
@Guy 'i' é para índice, j é a próxima letra depois de i
Martin Beckett
3
iej são bons ou até preferíveis na maioria dos casos, como Jerry aludiu. Um problema maior são os loops que são tão grandes que você não pode ver e compreender tudo em uma tela. Eles precisam ser reformulados para serem mais concisos.
28715 Craig
63

i - índice.

Uma variável temporária usada para indexar a iteração do loop. Se você já tem um i, o que é mais natural do que ir a j, ke assim por diante?

Nesse contexto, idxé frequentemente usado também.

Curto, simples e mostra exatamente qual é o uso da variável, como deveria ser o nome da variável.

littleadv
fonte
35
ijk = "Estou apenas brincando". :-)
Mahmoud Hossam
2
você pode citar uma referência?
Louis Rhys
23
Você pode me citar como referência, se quiser.
Capitão Sensible
11
Talvez valha a pena acrescentar que geralmente é literalmente um índice (subscrito) em uma matriz acessada no loop. Nem sempre, mas se você o vê como um índice nas interações ou não, ainda é conveniente generalizar de uma classe comum de loop para uma classe mais ampla de loop. BTW - esquisitice pessoal - para mim "índice" tende a implicar algo como "índice de banco de dados", incluindo dicionários de chave para subscrito / tabelas invertidas na memória; portanto, prefiro "subscrito" em vez de "índice" para evitar a ambiguidade. Mas eu ainda uso ipara loops.
21311 Steve
3
Em sua linha de pensamento, também ipoderia significar iterador.
precisa saber é o seguinte
39

Em FORTRAN, ifoi a primeira letra padrão para o tipo inteiro. A gama completa de tipos inteiros implícitos começava com as letras ide n. Trabalhando com loops para três dimensões nos levou i, je k. O padrão continuou para dimensões adicionais. Da mesma forma, 'x', 'y' e 'z', que padronizaram como ponto flutuante, foram usados ​​para variáveis ​​de loop que exigiam números reais.

Como litleadvobserva, itambém é uma contração mínima para o índice.

Dado o uso local dessas variáveis, não vejo problema em não usar um nome mais descritivo.

BillThor
fonte
Para loops únicos, eu concordo, mas para loops contendo loops, gosto de um pouco mais de descrição.
Edward Strange,
11
Em última análise, a resposta é inércia . Comecei a fazê-lo com WATFOR (Waterloo Fortran) em 1973 e ... eu ainda estou fazendo isso em 2011.
Peter Rowell
11
@ Crazy Eddie: Se os loops contiverem muitas funcionalidades, eu concordo. Mas com loops bem aninhados, o comprimento do código deve estar na ordem de n + 1 ou 2n + 1, em que n é o número de dimensões. Nesse caso, nomes de variáveis ​​mais longos podem diminuir a legibilidade.
BillThor
11
+1 em "In Fortran" porque é assim que essa tradição começou - não importa se você gosta ou não de Fortran.
Artem
34

Eu acredito que vem da Somatória :

Somatório

Rafael
fonte
3
Interessante! Isso é anterior ao FORTRAN, mas no contexto do CS?
kprobst
3
Como Backus tinha um mestrado em matemática, parece lógico.
dbasnett
9
A maioria dos primeiros gênios da ciência da computação era matemática ou engenharia elétrica, o que exigia matemática extensa. Ainda hoje, seu "nerd de computador" normalmente possui habilidades matemáticas acima da média, porque matemática e computadores são orientados de maneira lógica.
precisa saber é o seguinte
8

Foi-me dito, em parte pelo meu professor de teoria da computação, alguns anos atrás, que a origem era da notação matemática de somatório. i, j, k foram comumente usados ​​como variáveis ​​de iteração de número inteiro, e foram transferidos dos textos iniciais sobre a teoria da computação (que, é claro, é principalmente a matemática aplicada). Aparentemente, olhando para o trabalho de Knuth et al. confirma isso.

x, y, z como iterantes de ponto flutuante aparentemente surgiram com a popularidade do Fortran nas ciências físicas, de pesquisadores de física convertendo integrais em código-fonte (uma vez que as integrações geralmente eram feitas por limites espaciais ... como x vai para 100 e mais)

Eu não tenho uma referência para apoiar isso, mas como eu digo, veio de um professor bastante antigo e parece fazer muito sentido.

Espero que isto ajude

Stephen
fonte
6

Eu acho que i, j, k são usados ​​em matemática para indicar índices em somas e para elementos de matriz (i para as linhas ej para as colunas). Na notação matemática, algumas letras tendem a ser usadas com um significado específico com mais freqüência do que outras, por exemplo, a, b, c para constantes, f, g, h para funções, x, y, z para variáveis ​​ou coordenadas, i, j, k para índices. Pelo menos é o que me lembro da matemática que tirei na escola.

Talvez essa notação tenha sido transferida para a computação, porque no começo muitos cientistas da computação eram matemáticos ou, pelo menos, possuíam uma sólida formação matemática.

Giorgio
fonte
3

i == iterador ou índice

Meu entendimento sempre foi 'i' é uma boa opção, já que os loops geralmente são para iterar ou percorrer uma etapa de índice conhecida. As letras 'j' e 'k' seguem bem, uma vez que são frequentemente necessários loops aninhados e a maioria saberá instintivamente 'j' == segundo índice e 'k' == terceiro índice, uma vez que seguem esse padrão no alfabeto. Além disso, com muitos seguindo esta convenção padrão, pode-se assumir com segurança que um loop 'k' provavelmente terá um loop 'j' e 'i' envolvendo-o.

jimp
fonte
1

i, j, k são usados ​​no sistema de coordenadas cartesianas. Comparando com xey que representam eixos no mesmo sistema e que são sempre usados ​​como variáveis, podemos dizer que i, j e k também vieram daí.

Sergey
fonte
1

"i" é para índice.

Uma única letra facilita a leitura dos seus olhos pela linha de código. Para algo tão comum quanto o loop, um único caractere para o índice é ideal. Não há confusão quanto ao que "i" significa devido à convenção.

jojo
fonte
0

Quando comecei a programar, o Dartmouth BASIC era novo. Todas as variáveis ​​neste e em alguns outros idiomas da época eram caracteres únicos. Acrescente a isso a convenção de nomenclatura de variáveis ​​FORTRAN e o fato de ser muito mais fácil digitar, apenas um caractere, e a compreensão de programadores e professores mais antigos. Eu não sei, mas parece bom.

Dave
fonte