Perché le variabili "i" e "j" sono utilizzate per i contatori?


179

So che potrebbe sembrare una domanda assolutamente sciocca da porre, ma sono troppo curioso di non fare ...

Perché "i" e "j" sono diventati le variabili da utilizzare come contatori nella maggior parte delle strutture di controllo?

Sebbene il buon senso mi dica che sono proprio come X, che è usato per rappresentare valori sconosciuti, non posso fare a meno di pensare che ci debba essere un motivo per cui tutti ricevono la stessa istruzione più e più volte.

È perché è in realtà raccomandato per le migliori pratiche o una convenzione o ha qualche oscura ragione dietro di esso?

Per ogni evenienza, so di poter dare loro il nome che desidero e che i nomi delle variabili non sono rilevanti.


17
i = iterazione mentre j = dopo l'interazione
ajreal

7
strana 'c' non è stata scelta? come nel registro dei contatori Intel 'cx'.


16
Perché le domande reali diventano wiki della comunità solo perché sono popolari? Questo ricorda molto il comunismo. Se qualcuno inventa qualcosa di veramente interessante, il governo ruba l'invenzione da condividere con la comunità.
Orokusaki,

9
Chiusa in modo sbagliato: le risposte qui sono più informative rispetto agli altri qn ...
Charles Stewart,

Risposte:


330

Viene in definitiva dalla matematica: la notazione di sommatoria usa tradizionalmente i per il primo indice, j per il secondo e così via. Esempio (da http://en.wikipedia.org/wiki/Summation ):

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

Viene anche usato in questo modo per raccolte di cose, come se hai un mucchio di variabili x 1 , x 2 , ... x n , quindi una arbitraria sarà conosciuta come x i .

Per quanto riguarda il motivo per cui è così, immagino che SLaks sia corretto ed è perché sono la prima lettera in Index.


93
@SLott: E perché viene iusato in matematica?
SLaks

13
@Slaks: è una buona domanda. In realtà penso che "i" potrebbe venire dall'intero più che dall'indice. Penso anche che sia facile scrivere su una lavagna. Negli anni '70 siamo stati avvertiti di essere sicuri di aver scritto la nostra "i" e la "j" in un modo perfettamente distintivo. In effetti, ci fu detto di disegnare la nostra "i" esattamente come una "j" all'indietro per essere perfettamente chiari al riguardo.
S.Lott

26
@ S.Lott: dubito che provenga da numeri interi. Usiamo ℤ (lavagna in grassetto Z) per gli interi perché sta per la parola tedesca Zahlen , che significa numeri . Supponendo che la notazione della sommatoria sia sorta più o meno nello stesso momento, ci si aspetterebbe la notazione con base in tedesco - e la parola tedesca per indice è Index , che inizia anche con una i . E non riesco a pensare a molte lettere che sono particolarmente difficili da scrivere su una lavagna. Bene, tranne ξ :-)
Antal Spector-Zabusky

14
"Questa convenzione esiste perché questa convenzione esisteva prima." È così che funziona l'etimologia: nessuno sa perché un particolare rumore abbia un significato particolare in PIE. Sarebbe bello spiegare la convenzione matematica, ma la domanda è "perché vengono usati come contatori nelle strutture di controllo", quindi fino a quando qualcuno non produce una risposta che risale ulteriormente, questa è la migliore. Almeno specula sul perché sia ​​usato in matematica. Un vero matematico storico potrebbe scoprirlo, magari usando un taglio binario. Euclid non l'ha usato, scommetto che von Neumann l'ha fatto. Che ne dici di Cauchy? Ha usato molto gli indici
Steve Jessop il

14
Penso che sia stato Lagrange a raccomandare di usare a, b, c per le costanti di una funzione e x, y, z per le variabili di una funzione. i, j, k denotano le "direzioni" di un vettore e i fattori di una somma formale come questa possono essere interpretati come gradi di libertà [direzioni, con un altro nome] dell'equazione.
David,

200

Credo che risale a Fortran. Le variabili che iniziano da I a Q erano di default interi, le altre erano reali. Ciò significava che Iera la prima variabile intera, e Jla seconda, ecc., Quindi caddero verso l'uso nei loop.


53
Penso che questo provenga dal modo in cui ai matematici sembra piacere usare i, j, k come utili pedice per gli indici di moltiplicazione di sommatoria e matrice e quant'altro. Ricordo di aver letto in un primo manuale di Fortran II qualcosa al riguardo. (Sì, Fortran II.)
S. Lott

5
Sì, FORTRAN origina queste convenzioni.
Jé Queue,

9
Mi è stato insegnato Iattraverso Nnon Q. Google sembra essere per lo più d'accordo. (versioni diverse di FORTRAN?)
Hugh Allen

2
E tutto il resto a Fortran era, per impostazione predefinita, reale. Il che porta allo scherzo "Dio è reale, a meno che non sia dichiarato intero".
Lagerbaer,

4
@learnvst - perché i matematici avevano usato i, j per almeno un secolo prima.
Martin Beckett,

195

I matematici stavano usando i, j, k per designare numeri interi in algebra (pedici, serie, sommazioni ecc.) Molto prima (ad esempio 1836 o 1816 ) dei computer erano in giro (questa è l'origine delle impostazioni predefinite del tipo variabile FORTRAN). L'abitudine di usare lettere dalla fine dell'alfabeto (..., x, y, z) per variabili sconosciute e dall'inizio (a, b, c ...) per le costanti è generalmente attribuita a Rene Descartes , (vedi anche qui ) quindi presumo che io, j, k ... n (nel mezzo dell'alfabeto) per i numeri interi sia probabilmente dovuto anche a lui.


17
Per me, questa è chiaramente la risposta migliore. (Menzione d'onore per la risposta di Michael Borgwardt, che cita anche convenzioni matematiche ma non è così specifica.) Mi dispiace che la tua non sia quella accettata. Tutto quello che posso fare è dare il mio voto.
John Y,

3
Questo è esattamente il motivo per cui dobbiamo essere in grado di votare una risposta accettata dalla comunità (e sì, so che questo appartiene al servizio).
Kredns,

Eh. Di tanto in tanto aggiorno il link a un vecchio libro di Google in questa risposta perché google continua a tagliare roba in giro. Per caso, noto che il documento del 1816 ora collegato include Charles Babbage (presumibilmente lui di differenza motore / fama del motore analitico) come autore. Quindi probabilmente è un esempio del primo utilizzo di una variabile intera "i" da parte di un programmatore di computer: ^)
giorno

..OK il link del 1816 non va alla pagina con "i" usato su di esso, ma sono lì.
giorno

129

i = numero intero

Viene da Fortran dove le variabili intere dovevano iniziare con le lettere da I a N e le variabili reali iniziavano con le altre lettere. Quindi ero il primo e il più breve nome della variabile intera. Fortran è stato uno dei primi linguaggi di programmazione ad uso diffuso e le abitudini sviluppate dai programmatori che lo hanno utilizzato sono state trasferite ad altri linguaggi.

EDIT : non ho alcun problema con la risposta che deriva dalla matematica. Indubbiamente è qui che i designer Fortran hanno tratto ispirazione. Il fatto è che, per me, quando ho iniziato a programmare in Fortran abbiamo usato I, J, K, ... per i contatori di loop perché erano brevi e i primi nomi di variabili consentiti legalmente per gli interi. Come studente del secondo anno in HS avevo probabilmente sentito parlare di Cartesio (e di pochissimi altri), ma durante la programmazione ho avuto pochissime connessioni con la matematica. In effetti, il primo corso che ho seguito è stato chiamato "Fortran for Business" e non è stato insegnato dalla facoltà di matematica, ma dalla facoltà di economia / economia.

Per me, almeno, la denominazione delle variabili ha poco a che fare con la matematica, ma tutto a causa delle abitudini che ho imparato scrivendo il codice Fortran che ho portato in altre lingue.


4
Sono abbastanza sicuro che fosse FORTRAN.
Cade Roux,

4
Ya, fortran ..... rompe la mente. Abbiamo un programmatore che utilizza i ii e iii come nomi di variabili di loop. L'altro sintomo è la variabile di 6 caratteri / nomi di funzioni senza vocali.
EvilTeach

4
@tvan, sono abbastanza sicuro che le variabili che iniziano con I fino a N sono passate automaticamente a numeri interi, ma potresti comunque dichiararle reali quindi lo scherzo "Dio è reale, a meno che non sia dichiarato intero". +1 comunque, dal momento che il mio ricordo di tanti anni fa potrebbe NON essere perfetto.
paxdiablo,

10
Ehi, i ragazzi della FORTRAN hanno fatto fuori dai matematici!
martedì

6
Sono d'accordo con @timday. Usare i come indice di una serie è stata una pratica dei matematici per almeno 2 secoli.
Scottie T,

91

ista per I ndex.
jviene dopo i.


12
Penso che stesse parlando dell'alfabeto, prova a usare un po 'di immaginazione :)
Jack

33
@Jack: Penso che @Pete stesse scherzando ;-)
Chris Pfohl

13
@Cpfohl: sì, volevo solo essere noioso: D
Jack

4
@Pete Kirkham: Grazie mille Pete, è stata la migliore risata che ho avuto nell'ultimo mese.
AMissico,

@SLaks ... Credo che abbia ragione i = Index che proviene dalla notazione dell'indice utilizzata in Math en.wikipedia.org/wiki/Index_notation o qui è un bel riferimento physics.ucsb.edu/~physCS31/fall2010/index- notation.pdf
John Hartsock,

63

Questi simboli erano usati come indici di matrice in matematica molto prima dell'invenzione dei computer elettronici.


52

Penso che sia probabilmente derivato dall'indice (in senso matematico ) - è comunemente usato come indice in somme o altre operazioni basate su insiemi, e molto probabilmente è stato usato in questo modo da prima che esistessero linguaggi di programmazione.


Buona risposta. Questa (per me) sembra davvero la spiegazione più probabile.
Noldorin

3
Sì. La notazione matematica per una somma come Y = Σ Xiprecede ogni linguaggio di programmazione.
Treb,

Sto pensando all'indice ogni volta che lo uso i. Ma originariamente lo uso principalmente perché tutto il codice che guardo altrove lo usa, e che può essere ereditato dai programmatori Fortran ...
timore

47

C'è una preferenza in matematica per l'uso di lettere consecutive nell'alfabeto per variabili "anonime" usate in modo simile. Quindi, non solo "i, j, k", ma anche "f, g, h", "p, q, r", "x, y, z" (raramente con "u, v, w" anteposto), e "α, β, γ".

Ora "f, g, h" e "x, y, z" non sono usati liberamente: il primo è per le funzioni, il secondo per le dimensioni. "p, q, r" sono spesso usati anche per le funzioni.

Quindi ci sono altri vincoli sulle sequenze disponibili: "l" e "o" sono evitati, perché sembrano troppo "1" e "0" in molti caratteri. "t" è spesso usato per il tempo, "d & δ" per i differenziali e "a, s, m, v" per le misure fisiche di accelerazione, spostamento, massa e velocità. Ciò non lascia così tante lacune di tre lettere consecutive senza associazioni indesiderate in matematica per gli indici.

Quindi, come molti altri hanno notato, le convenzioni della matematica hanno avuto una forte influenza sulle prime convenzioni di programmazione e "α, β, γ" non erano disponibili in molti primi set di caratteri.


2
Concordato. Anche se, a, b, cè una sequenza abbastanza comunemente usata nonostante aabbia molteplici significati ...
Stobor

32

Ho trovato un'altra possibile risposta che potrebbe essere che io, j e k provengono Hamilton's Quaternions.

testo alternativo

Euler lo scelse per l'unità immaginaria.

Hamilton aveva bisogno di altre due radici quadrate di -1: ii = jj = kk = ijk = -1

Hamilton è stato davvero influente, e i quaternioni erano il modo standard di fare analisi 3D prima del 1900. A quel punto, i matematici erano abituati a pensare (ijk) come un set abbinato. Il calcolo vettoriale ha sostituito l'analisi quaternionica nel 1890 perché era un modo migliore per scrivere le equazioni di Maxwell. Ma le persone tendevano a scrivere quantità vettoriali in questo modo: (3i-2j+k) invece di (3,-2,1) . Quindi (ijk) è diventato il vettore base standard in R ^ 3.

Infine, i fisici hanno iniziato a utilizzare la teoria dei gruppi per descrivere le simmetrie nei sistemi di equazioni differenziali. Quindi (ijk) ha iniziato a connotare "vettori che vengono scambiati dai gruppi di permutazione", poi si è spostato verso "cose ​​simili a indici che assumono tutti i valori possibili in un set specificato", che è fondamentalmente ciò che significano in un ciclo for.


11
finalmente un approccio diverso alla domanda, interessante punto +1
Fabian

30

scartando (un po 'di parte)

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

3
Vedo n come number, di solito il numero di elementi in un set.
Tom Leys,

6
Oh uomini, e quale XXX sembra essere? )) +1 per la creatività;)
Hovhannes Grigoryan,

A volte sono contento che la maggior parte delle volte non mi debba preoccupare di che tipo di mnemonica gli altri escogitano nelle loro teste per cose del genere ...
Thies Heidecke,

21

Un pomeriggio soleggiato, Archimede che meditava ( come al solito per i pomeriggi assolati ) e si imbatté nel suo amico Eratostene.

Archimede disse: "Saluto da Archimede a Eratostene! Sto cercando di trovare una soluzione al rapporto tra diversi corpi sferici rigidi in equilibrio. Vorrei scorrere più volte su questi corpi, ma mi sto divertendo terribilmente a tenere traccia di quante iterazioni ho fatto! "

Eratostene disse: "Perché Archimede, prugna matura di un bambino, potresti semplicemente segnare successive file di linee nella sabbia, ognuna tenendo traccia del numero di iterazioni che hai fatto all'interno dell'iterazione!"

Archimede gridò al mondo che il suo grande amico era innegabilmente un fulgido faro di intelligenza per aver trovato una soluzione così semplice. Ma Archimede ha osservato che gli piace camminare in cerchio attorno alla sua cava di sabbia mentre medita. Pertanto, c'era il rischio di perdere la traccia di quale riga era in cima e quale era in fondo.

"Forse dovrei contrassegnare queste righe con una lettera dell'alfabeto appena sul lato in modo da sapere sempre quale riga è quale! Cosa ne pensi di questo?" chiese, poi aggiunse: "Ma Eratostene ... quali lettere dovrei usare?"

Eratostene era sicuro di non sapere quali fossero le lettere migliori e disse altrettanto ad Archimede. Ma Archimede non era soddisfatto e continuò a spingere il povero bibliotecario a scegliere, almeno, le due lettere che avrebbe richiesto per la sua attuale soluzione di equilibrio della sfera.

Eratostene, finalmente stanco della incessante richiesta di due lettere, urlò: "NON LO SO SOLO !!!"

Così Archimede scelse le prime due lettere nella frase esclamativa di Eratostene e ringraziò l'amico per il contributo.


Questi simboli sono stati rapidamente adottati dagli antichi sviluppatori Java greci e il resto è, beh ... storia.


6
... e aveva la lettera j.
Andrew Grimm,

Wow, sembra quasi la storia di una tartaruga e di Achille dal GEB di Hofstadter
ProfK,

15

penso che sia perché molti loop usano una variabile di tipo Int per fare il conteggio, come

for (int i = 0; etc

e quando digiti, in realtà lo dici nella tua testa (come quando leggi), quindi nella tua mente dici "int ...."

e quando devi inventare una lettera subito dopo 'int ....', dici / digita 'i' perché quella è la prima lettera che pensi quando hai appena detto 'int'

come se dessi una parola ai bambini che iniziano a imparare a leggere le parole per loro usando i nomi, in questo modo:

Incantesimi WORD William W, Ok O, Ruby R, Fatto D

Quindi dici Int I, Double d, Float f, string s ecc. In base alla prima lettera.

E j è usato perché quando hai fatto int I, J lo segue subito dopo.


7
iprecede questa sintassi.
SLaks,

1
È un ottimo modo per confondere la merda di un bambino; insegni davvero ai tuoi di fare lo spelling in quel modo ?!
Corse di leggerezza in orbita

14

Penso che sia una combinazione degli altri motivi citati:

Tanto per cominciare, "i" era comunemente usato dai matematici nella loro notazione, e nei primi tempi dell'informatica con linguaggi che non erano binari (cioè dovevano essere analizzati e sciolti in qualche modo), la stragrande maggioranza degli utenti di computer era anche matematici (... e scienziati e ingegneri), quindi la notazione è entrata in uso nei linguaggi informatici per i cicli di programmazione, e da allora è rimasta bloccata.

Combinalo con il fatto che lo spazio sullo schermo in quei primi tempi era molto limitato, così come lo era la memoria, aveva senso mantenere nomi di variabili più brevi.


13

Forse storico?

FORTRAN, evidentemente il primo linguaggio di alto livello, ha definito i, j, k, l, m come tipi di dati Integer per impostazione predefinita e i loop potrebbero essere controllati solo da variabili intere, la convenzione continua?

per esempio:

do 100 i = j, 100,5 .... 100 continua ....


FWIW, di solito salto la lettera l perché assomiglia troppo al numero 1.
Nosredna,

13

i = iteratore, i = indice, i = numero intero

Qualunque sia la tua figura "i" significa che "si adatta perfettamente al conto".

Inoltre, a meno che tu non abbia una sola riga di codice all'interno di quel ciclo, dovresti probabilmente nominare la variabile iteratore / indice / intero in qualcosa di più significativo. Mi piace: employeeIndex

A proposito, di solito uso "i" nei miei semplici loop iteratori; a meno che ovviamente non contenga più righe di codice.


13

i = iota, j = jot; entrambi piccoli cambiamenti.

iota è la lettera più piccola dell'alfabeto greco; nella lingua inglese il suo significato è collegato a piccoli cambiamenti, come in "non una iota" (da una frase del Nuovo Testamento: "fino a quando il cielo e la terra passeranno, non una iota, non un punto, passerà dalla Legge" (Mt 5:18)).

Un contatore rappresenta una piccola modifica di un valore.

E da iota arriva jot (iot), che è anche sinonimo di un piccolo cambiamento.

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


13

Bene dalla matematica: (per lettere latine)

a, b: usato come costanti o come numeri interi per un numero razionale
c: una costante
d: derivata
e: numero di Eulero
f, g, h: funzioni
i, j, k: sono indici (anche vettori di unità e quaternioni)
l: generalmente non utilizzato. assomiglia a 1
m, n: sono righe e colonne di matrici o come numeri interi per numeri razionali
o: anche non usati (a meno che non ci sia poca notazione)
p, q: spesso usati come numeri primi
r: a volte un cambiamento spaziale della variabile altre volte relative ai numeri primi
s, t: variabili spaziali e temporali o s viene utilizzata come variazione della variabile per t
u, v, w: modifica della variabile
x, y, z: variabili


11

Molte possibili ragioni principali, immagino:

  • i matematici usano ie jper i numeri naturali nelle formule (quelli che usano i numeri complessi raramente, almeno), quindi questo è passato alla programmazione
  • da C , isuggerimenti a int. E se avete bisogno di un altro int, allora i2è semplicemente troppo lungo, quindi si decide di utilizzare j.
  • ci sono lingue in cui la prima lettera decide il tipo e iquindi è un integer.


7

Proviene sicuramente dalla matematica, che ha preceduto a lungo la programmazione informatica.

Quindi, da dove proviene la matematica? La mia ipotesi completamente non istruita è che è come ha detto un altro, ai matematici piace usare i cluster alfabetici per cose simili - f, g, h per le funzioni; x, y, z per variabili numeriche; p, q, r per variabili logiche; u, v, w per altri insiemi di variabili, specialmente nel calcolo; a, b, c per molte cose. i, j, k è utile per le variabili iterative e questo esaurisce le possibilità. Perché non m, n? Bene, sono usati per numeri interi, ma più spesso i punti finali delle iterazioni piuttosto che le stesse variabili iterative.

Qualcuno dovrebbe chiedere a uno storico della matematica.


6

I contatori sono così comuni nei programmi e nei primi tempi dell'informatica, tutto era un premio ... I
programmatori naturalmente cercavano di conservare i pixel e la "i" richiedeva meno pixel di qualsiasi altra lettera per rappresentare. (I matematici, essendo pigri, lo hanno scelto per lo stesso motivo - come il più piccolo glifo).
Come affermato in precedenza, 'j' ha seguito naturalmente ...

:)


24
All'inizio dell'informatica, i pixel non esistevano .
SLaks,

1
@Slaks, questo è un commento vincente. Basta vedere il sorriso sul mio viso leggerlo e i voti. Bello!
ProfK,

"I programmatori hanno naturalmente cercato di conservare i pixel e la" i "ha richiesto meno pixel rispetto a qualsiasi altra lettera da rappresentare." <<< che è divertente.
ocodo,

1
... e così è nata l'ottimizzazione prematura!
Gerrat,

4

Lo uso per una serie di motivi.

  • Di solito i miei loop sono basati su int, quindi crei un triangolo completo sulla tastiera digitando "int i" con l'eccezione dello spazio che gestisco con il pollice. Questa è una sequenza molto veloce da digitare.

  • La "i" potrebbe indicare iteratore, numero intero, incremento o indice, ciascuno dei quali ha un senso logico.

Con i miei usi personali messi da parte, la teoria che deriva da FORTRAN è corretta, dove i numeri interi usati usano le lettere I - N.


4

Ho imparato FORTRAN su un Control Data Corp. 3100 nel 1965. Le variabili che iniziano con "I" fino a "N" erano implicite come numeri interi. Esempio: 'IGGY' e 'NORB' erano numeri interi, 'XMAX' e 'ALPHA' erano in virgola mobile. Tuttavia, è possibile ignorare ciò mediante una dichiarazione esplicita.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.