Por que as variáveis ​​"i" e "j" são usadas para contadores?

179

Eu sei que isso pode parecer uma pergunta absolutamente boba, mas estou curiosa demais para não perguntar ...

Por que "i" e "j" se tornaram AS variáveis ​​a serem usadas como contadores na maioria das estruturas de controle?

Embora o senso comum me diga que eles são exatamente como X, que é usado para representar valores desconhecidos, não posso deixar de pensar que deve haver uma razão pela qual todos são ensinados da mesma maneira repetidamente.

É porque é realmente recomendado para práticas recomendadas, ou uma convenção, ou tem alguma razão obscura por trás disso?

Por precaução, sei que posso dar a eles o nome que quiser e que os nomes das variáveis ​​não são relevantes.

Carlos
fonte
17
i = iteração enquanto j = após a interação
ajreal
7
estranho 'c' não foi escolhido? como no contador da Intel 'cx'.
12
Coordenadas cartesianas
Nick Dandoulakis
16
Por que as perguntas reais se tornam wikis da comunidade apenas por serem populares? Isso parece muito remanescente do comunismo. Se alguém inventa algo realmente legal, o governo rouba a invenção para compartilhar com a comunidade.
Orokusaki
9
Fechado caminho errado: as respostas aqui são mais informativos do que para o outro qn ...
Charles Stewart

Respostas:

330

Em última análise, vem da matemática: a notação de soma tradicionalmente usa i para o primeiro índice, j para o segundo e assim por diante. Exemplo (de http://en.wikipedia.org/wiki/Summation ):

\ sum_ {i = 1} ^ {n} i = \ frac {n ^ 2 + n} {2}

Também é usado dessa maneira para coleções de coisas, como se você tiver várias variáveis ​​x 1 , x 2 , ... x n , uma arbitrária será conhecida como x i .

Por que é assim, imagino que o SLaks esteja correto e porque eu sou a primeira letra do Index.

zwol
fonte
93
@ Slott: E por que é iusado em matemática?
SLaks
13
@ Slicks: Essa é uma boa pergunta. Na verdade, acho que "i" pode vir de um número inteiro mais que do índice. Também acho fácil escrever no quadro-negro. Nos anos 70, fomos alertados para ter certeza de que escrevemos nosso "i" e "j" de uma maneira perfeitamente distinta. De fato, nos disseram para desenhar nosso "i" exatamente como um "j" atrasado para ser perfeitamente claro sobre isso.
precisa saber é o seguinte
26
@ S.Lott: Duvido que venha de número inteiro. Usamos ℤ (quadro-negro em negrito Z) para os números inteiros porque significa a palavra alemã Zahlen , que significa números . Supondo que a notação de somatório tenha surgido na mesma época, seria esperada a notação em alemão - e a palavra em alemão para index é Index , que também começa com um i . E não consigo pensar em muitas letras que são particularmente difíceis de escrever em um quadro-negro. Bem, exceto ξ :-)
Antal Spector-Zabusky
14
"Esta convenção existe porque já existia antes." É assim que a etimologia funciona: ninguém sabe por que um ruído específico tinha um significado particular na TORTA. Seria bom explicar a convenção matemática, mas a pergunta é "por que eles são usados ​​como contadores em estruturas de controle"; portanto, até que alguém produza uma resposta que remova mais, esse é o melhor. Pelo menos especula por que é usado em matemática. Um historiador matemático adequado poderia descobrir, talvez usando um golpe binário. Euclides não o usou, aposto que von Neumann. Que tal Cauchy? Ele usou índices muito
Steve Jessop
14
Eu acho que foi Lagrange quem recomendou o uso de a, b, c para constantes de uma função ex, y, z para variáveis ​​de uma função. i, j, k denotam as 'direções' de um vetor, e os fatores de uma soma formal como essa podem ser interpretados como graus de liberdade [direções, com outro nome] da equação.
David
200

Eu acredito que remonta a Fortran. As variáveis ​​que começam com I a Q eram inteiras por padrão, as outras eram reais. Isso significava que Iera a primeira variável inteira e Ja segunda, etc., então elas caíram no uso de loops.

Ignacio Vazquez-Abrams
fonte
53
Eu acho que isso vem da maneira como os matemáticos parecem gostar de usar i, j, k como subscripts úteis para índices de soma e multiplicação de matrizes e o que não. Lembro-me de ler um manual anterior do Fortran II sobre isso. (Sim, Fortran II.)
S. Lott
5
Sim, o FORTRAN origina essas convenções.
Jé Queue
9
Eu fui ensinado Ipor Nnão Q. O Google parece concordar principalmente. (versões diferentes do Fortran?)
Hugh Allen
2
E tudo o mais em Fortran era, por padrão, real. O que leva à piada "Deus é real, a menos que seja declarado inteiro".
Lagerbaer
4
@learnvst - porque os matemáticos usavam i, j há pelo menos um século antes.
Martin Beckett
195

Os matemáticos estavam usando i, j, k para designar números inteiros em álgebra (subscritos, séries, somas etc.) muito antes (por exemplo, 1836 ou 1816 ) de computadores (por exemplo, 1836 ou 1816 ) (esta é a origem dos padrões do tipo variável FORTRAN). O hábito de usar letras do final do alfabeto (..., x, y, z) para variáveis ​​desconhecidas e do começo (a, b, c ...) para constantes é geralmente atribuído a René Descartes (consulte também aqui ), então suponho que i, j, k ... n (no meio do alfabeto) para números inteiros provavelmente seja devido a ele também.

timday
fonte
17
Para mim, essa é claramente a melhor resposta. (Menção honrosa pela resposta de Michael Borgwardt, que também cita convenções matemáticas, mas não é tão específica.) Lamento que a sua não seja a aceita. Tudo o que posso fazer é dar meu voto positivo.
21926 John Y
3
Essa é exatamente a razão pela qual precisamos votar em uma resposta aceita pela comunidade (e sim, eu sei que isso pertence ao uservoice).
Kredns
Heh. Ocasionalmente, atualizo o link para um livro antigo do Google nesta resposta, porque o Google continua cortando coisas. Por acaso, observo que o documento de 1816 agora vinculado inclui Charles Babbage (presumivelmente ele de diferença de mecanismo / fama de mecanismo analítico) como autor. Então, sem dúvida, é um exemplo do primeiro uso de uma variável inteiro "i" por um programador de computador: ^)
timday
..OK o link 1816 não vai para a página com "i" usado, mas eles estão lá.
timday
129

i = inteiro

Vem de Fortran, onde variáveis ​​inteiras tiveram que começar com as letras I a N e variáveis ​​reais começaram com as outras letras. Portanto, eu era o primeiro e menor nome da variável inteira. O Fortran foi uma das linguagens de programação mais antigas em uso generalizado e os hábitos desenvolvidos pelos programadores que o utilizavam foram transferidos para outras linguagens.

Edição : Eu não tenho nenhum problema com a resposta que deriva da matemática. Sem dúvida, foi aí que os designers do Fortran se inspiraram. O fato é que, para mim, quando comecei a programar no Fortran, usamos I, J, K, ... para contadores de loop porque eram curtos e os primeiros nomes de variáveis ​​permitidos legalmente para números inteiros. No segundo ano do ensino médio, provavelmente já tinha ouvido falar de Descartes (e muito poucos outros), mas fiz muito pouca conexão com a matemática ao programar. De fato, o primeiro curso que fiz foi chamado "Fortran for Business" e foi ministrado não pela faculdade de matemática, mas pela faculdade de economia / negócios.

Para mim, pelo menos, o nome das variáveis ​​tinha pouco a ver com a matemática, mas tudo devido aos hábitos que aprendi escrevendo código Fortran que carregava em outras línguas.

tvanfosson
fonte
4
Tenho certeza de que era FORTRAN.
Cade Roux
4
Sim, fortran ... Isso apodrece a mente. Temos um programador que usa i ii e iii como nomes de variáveis ​​de loop. O outro sintoma são nomes de variáveis ​​/ funções de 6 caracteres sem vogais.
EvilTeach
4
@ tvan, tenho certeza de que as variáveis ​​que começam com I a N são padronizadas como número inteiro, mas você ainda pode declará-las reais, daí a piada "Deus é real, a menos que seja declarado inteiro". +1 de qualquer maneira, pois minha lembrança de tantos anos atrás pode NÃO ser perfeita.
paxdiablo
10
Ei, os caras do FORTRAN tiraram isso dos matemáticos!
timday 18/01/09
6
Eu concordo com @timday. Usar i como índice de uma série é uma prática dos matemáticos há pelo menos dois séculos.
21475 Scottie T
91

isignifica I ndex.
jvem depois i.

SLaks
fonte
12
Eu acho que ele estava falando alfabeto, tente usar um pouco de imaginação :)
Jack
33
@Jack: Eu acho que @Pete estava brincando ;-)
Chris Pfohl
13
@Cpfohl: sim, só queria ser chato: D
Jack
4
@Pete Kirkham: Muito obrigado Pete, foi a melhor risada que tive no mês passado.
Novissimo
@SLaks ... Acredito que esteja certo i = Index, que vem da notação de índice usada em Math en.wikipedia.org/wiki/Index_notation ou aqui está uma boa referência physics.ucsb.edu/~physCS31/fall2010/index- notation.pdf
John Hartsock
63

Esses símbolos foram usados ​​como índices matriciais em matemática muito antes da invenção dos computadores eletrônicos.

erickson
fonte
52

Eu acho que é provavelmente derivado do índice (no sentido matemático ) - é usado geralmente como um índice em somas ou outras operações baseadas em conjuntos, e provavelmente já foi usado dessa maneira desde antes de haver linguagens de programação.

Michael Borgwardt
fonte
Boa resposta. Esta (para mim) realmente parece ser a explicação mais provável.
Noldorin
3
Sim. A notação matemática para uma soma como Y = Σ Xiprecede toda linguagem de programação.
Treb 23/03/09
Estou pensando em índice cada vez que uso i. Mas originalmente eu usá-lo, principalmente porque todos olhar código que em outro lugar usá-lo, e que pode ser herdada de programadores Fortran ...
temor
47

Existe uma preferência em matemática pelo uso de letras consecutivas no alfabeto para variáveis ​​"anônimas" usadas de maneira semelhante. Portanto, não apenas "i, j, k", mas também "f, g, h", "p, q, r", "x, y, z" (raramente com "u, v, w" anexado), e "α, β, γ".

Agora "f, g, h" e "x, y, z" não são usados ​​livremente: o primeiro é para funções, o último para dimensões. "p, q, r" também são frequentemente usados ​​para funções.

Existem outras restrições nas seqüências disponíveis: "l" e "o" são evitadas, porque se parecem muito com "1" e "0" em muitas fontes. "t" é frequentemente usado para o tempo, "d & δ" para diferenciais e "a, s, m, v" para as medidas físicas de aceleração, deslocamento, massa e velocidade. Isso deixa poucas lacunas de três letras consecutivas sem associações indesejadas em matemática para índices.

Então, como vários outros notaram, as convenções da matemática tiveram uma forte influência nas convenções de programação iniciais, e "α, β, γ" não estavam disponíveis em muitos conjuntos de caracteres iniciais.

Charles Stewart
fonte
2
Acordado. Embora, a, b, cé uma sequência bastante comumente usado, apesar de ater vários significados ...
Stobor
32

Encontrei outra resposta possível: i, j e k vêm Hamilton's Quaternions.

texto alternativo

Euler escolheu i para a unidade imaginária.

Hamilton precisava de mais duas raízes quadradas de -1: ii = jj = kk = ijk = -1

Hamilton era realmente influente, e os quaternions eram a maneira padrão de fazer a análise 3D antes de 1900. Até então, os matemáticos estavam acostumados a pensar em (ijk) como um conjunto correspondente. O cálculo vetorial substituiu a análise quaterniônica na década de 1890, porque era a melhor maneira de escrever as equações de Maxwell. Mas as pessoas tendiam a escrever quantidades vetoriais assim: em (3i-2j+k) vez de (3,-2,1) . Então (ijk) se tornou o vetor base padrão em R ^ 3.

Finalmente, os físicos começaram a usar a teoria dos grupos para descrever simetrias em sistemas de equações diferenciais. Então (ijk) começou a conotar "vetores que são trocados por grupos de permutação", depois se direcionou para "coisas semelhantes a índices que assumem todos os valores possíveis em algum conjunto especificado", que é basicamente o que elas significam em um loop for.

Carlos
fonte
11
enfim, uma abordagem diferente da questão, ponto interessante +1
Fabian
30

descartando (um pouco tendencioso)

a seems an array
b seems another array 
c seems a language name
d seems another language name
e seems exception
f looks bad in combination with "for" (for f, a pickup?)
g seems g force
h seems height

i seems an index                    
j seems i (another index)

k seems a constant k
l seems a number one (1) 
m seems a matrix
n seems a node
o seems an output
p sounds like a pointer
q seems a queue
r seems a return value
s seems a string
t looks like time
u reserved for UVW mapping or electic phase 
v reserved for UVW mapping or electic phase or a vector
w reserved for UVW mapping or electic phase or a weight
x seems an axis (or an unknown variable)
y seems an axis
z seems a third axis
Hernán Eche
fonte
3
Eu vejo n como number, geralmente o número de elementos em um conjunto.
Tom Leys
6
Oh homens, e o que XXX parece ser? )) +1 pela criatividade;)
Hovhannes Grigoryan 12/03
Às vezes eu estou contente que a maioria do tempo eu não precisa se preocupar com o que classifica de mnemônicos outras pessoas vêm para cima com em suas cabeças para coisas assim ...
Thies Heidecke
21

Numa tarde ensolarada, Arquimedes ponderou ( como era habitual nas tardes ensolaradas ) e encontrou seu amigo Eratóstenes.

Arquimedes disse: "Saudação de Arquimedes a Eratóstenes! Estou tentando encontrar uma solução para a proporção de vários corpos rígidos esféricos em equilíbrio. Desejo percorrer esses corpos várias vezes, mas estou tendo um tempo assustador para acompanhar de quantas iterações eu fiz! "

Eratóstenes disse: "Por que Arquimedes, sua ameixa madura, você pode simplesmente marcar sucessivas linhas de linhas na areia, cada uma acompanhando o número de iterações que você fez na iteração!"

Arquimedes gritou ao mundo que seu grande amigo era inegavelmente um farol brilhante de inteligência por ter encontrado uma solução tão simples. Arquimedes, porém, observou que ele gosta de andar em círculos em torno de seu poço de areia enquanto ele pondera. Assim, havia o risco de perder a noção de qual linha estava no topo e qual estava no fundo.

"Talvez eu deva marcar essas linhas com uma letra do alfabeto logo ao lado, para que eu sempre saiba qual linha é qual! O que você acha disso?" ele perguntou e acrescentou: "Mas Eratóstenes ... que letras devo usar?"

Eratóstenes tinha certeza de que não sabia quais letras seriam melhores e disse o mesmo a Arquimedes. Arquimedes, porém, estava insatisfeito e continuou incitando o pobre bibliotecário a escolher, pelo menos, as duas letras que ele exigiria para sua atual solução de equilíbrio de esferas.

Eratóstenes, finalmente cansado do pedido incessante de duas cartas, gritou: "EU NÃO SEI !!!"

Assim, Arquimedes escolheu as duas primeiras letras da sentença exclamadora de Eratóstenes e agradeceu ao amigo pela contribuição.


Esses símbolos foram rapidamente adotados pelos desenvolvedores de Java da Grécia antiga, e o resto é, bem ... história.

Brendan
fonte
6
... e tinha a carta j.
Andrew Grimm
Uau, isso quase parece uma história de Tartaruga e Aquiles do GEB de Hofstadter
ProfK
15

Eu acho que é porque muitos loops usam uma variável do tipo Int para fazer a contagem, como

for (int i = 0; etc

e quando você digita, na verdade fala na sua cabeça (como quando lê), então na sua mente você diz 'int ....'

e quando você precisa criar uma carta logo após esse 'int ....', você diz / digita o 'i' porque é a primeira letra em que você pensa quando acaba de dizer 'int'

como você escreve uma palavra para crianças que começam a aprender a ler, você escreve palavras para elas usando nomes, assim:

PALAVRA soletra William W, Ok O, Ruby R, Feito D

Então você diz Int I, Double d, Float f, string s etc. com base na primeira letra.

E j é usado porque, quando você faz int I, J segue logo depois.

Michel
fonte
7
iantecede essa sintaxe.
SLaks
1
Essa é uma ótima maneira de confundir a porcaria de uma criança; você realmente ensina o seu a soletrar assim ?!
Lightness Races in Orbit
14

Eu acho que é uma combinação dos outros motivos mencionados:

Para iniciantes, 'i' era comumente usado por matemáticos em suas notações, e nos primeiros dias de computação com linguagens que não eram binárias (ou seja, tinham que ser analisadas e lexadas de alguma maneira), a grande maioria dos usuários de computadores era também matemáticos (... e cientistas e engenheiros), de modo que a notação passou a ser usada em linguagens de computador para loops de programação e, desde então, ficou travada.

Combine isso com o fato de que o espaço na tela naqueles primeiros dias era muito limitado, assim como a memória, fazia sentido manter nomes de variáveis ​​mais curtos.

Alex Marshall
fonte
13

Possivelmente histórico?

FORTRAN, indiscutivelmente o primeiro idioma de alto nível, definido i, j, k, l, m como tipos de dados Inteiros por padrão, e os loops só podiam ser controlados pela variável inteira, a convenção continua?

por exemplo:

faça 100 i = j, 100,5 .... 100 continue ....

brett
fonte
FWIW, eu costumo pular a letra l porque parece muito com o número 1.
Nosredna
13

i = iterador, i = índice, i = inteiro

O que quer que você imagine "i" significa que ainda "se encaixa na conta".

Além disso, a menos que você tenha apenas uma única linha de código nesse loop, provavelmente deve nomear a variável iterador / índice / número inteiro para algo mais significativo. Como: employeeIndex

BTW, eu normalmente uso "i" nos meus loops iteradores simples; a menos que, é claro, contenha várias linhas de código.

Chris Pietschmann
fonte
13

i = iota, j = jot; duas pequenas mudanças.

iota é a menor letra do alfabeto grego; no idioma inglês, seu significado está ligado a pequenas mudanças, como em "nem um pingo" (de uma frase no Novo Testamento: "até que o céu e a terra passem, nem um pingo, nem um ponto passará da Lei" (Mt 5:18)).

Um contador representa uma pequena alteração em um valor.

E do iota vem o jot (iot), que também é sinônimo de uma pequena alteração.

cf. http://en.wikipedia.org/wiki/Iota

Stephen
fonte
13

Bem de matemática: (para letras latinas)

a, b: usado como constantes ou como números inteiros para um número racional
c: uma constante
d: derivada
e: número do euler
f, g, h: funções
i, j, k: são índices (também vetores unitários e quaternários)
l: geralmente não usado. se parece com 1
m, n: são linhas e colunas de matrizes ou como números inteiros para números racionais
o: também não é usado (a menos que você esteja com pouca notação)
p, q: frequentemente usado como números primos
r: às vezes uma mudança espacial da variável outros tempos relacionados aos números primos
s, t: variáveis ​​espaciais e temporais ou s é usado como uma mudança de variável para t
u, v, w: mudança da variável
x, y, z: variáveis

MaDMaD Mad
fonte
11

Muitas razões principais possíveis, eu acho:

  • os matemáticos usam ie jpara Números Naturais em fórmulas (aqueles que usam Números Complexos raramente, pelo menos), então isso foi transferido para a programação
  • de C , idicas para int. E se você precisar de outro int, i2é muito longo, então você decide usá-lo j.
  • existem idiomas em que a primeira letra decide o tipo e ié então um integer.
towi
fonte
10

Vem de Fortran, onde i, j, k, l, m, n são implicitamente inteiros.

Walter Bright
fonte
7

Definitivamente, vem da matemática, que precedeu a programação de computadores.

Então, de onde veio se em matemática? Meu palpite completamente inculto é que, como um colega disse, os matemáticos gostam de usar grupos alfabéticos para coisas semelhantes - f, g, h para funções; x, y, z para variáveis ​​numéricas; p, q, r para variáveis ​​lógicas; u, v, w para outros conjuntos de variáveis, especialmente em cálculo; a, b, c para muitas coisas. i, j, k é útil para variáveis ​​iterativas, e isso esgota as possibilidades. Por que não m, n? Bem, eles são usados ​​para números inteiros, mas mais frequentemente os pontos finais das iterações, em vez das próprias variáveis ​​iterativas.

Alguém deveria perguntar a um historiador da matemática.

David Lewis
fonte
6

Os contadores são tão comuns em programas e, nos primeiros dias da computação, tudo era um prêmio ... Os
programadores naturalmente tentaram conservar pixels, e o 'i' exigia menos pixels do que qualquer outra letra para representar. (Os matemáticos, sendo preguiçosos, escolheram o mesmo motivo - como o menor glifo).
Como afirmado anteriormente, 'j' seguiu naturalmente ...

:)

Gerrat
fonte
24
Nos primeiros dias da computação, os pixels não existiam .
SLaks
1
@Slaks, esse é um comentário vencedor. Basta ver o sorriso no meu rosto lendo e os votos. Agradável!
ProfK
"Os programadores naturalmente tentaram conservar pixels, e o 'i' exigia menos pixels do que qualquer outra letra para representar". <<< isso é hilário.
ocodo
1
... e assim nasceu a otimização prematura!
Gerrat
4

Eu o uso por vários motivos.

  • Normalmente, meus loops são baseados em int, então você cria um triângulo completo no teclado digitando "int i", com exceção do espaço que manuseio com o polegar. Essa é uma sequência muito rápida de digitar.

  • O "i" pode representar iterador, número inteiro, incremento ou índice, cada um dos quais faz sentido lógico.

Com meus usos pessoais anulados, a teoria de que ela é derivada de FORTRAN está correta, onde vars inteiros usavam as letras I - N.

John T
fonte
4

Eu aprendi o FORTRAN no Control Data Corp. 3100 em 1965. As variáveis ​​que começavam com 'I' a 'N' estavam implícitas como inteiros. Ex: 'IGGY' e 'NORB' eram inteiros, 'XMAX' e 'ALPHA' eram de ponto flutuante. No entanto, você pode substituir isso por meio de declaração explícita.

Pierre
fonte