Perché la maggior parte di noi usa "i" come variabile contatore contatore?


126

Qualcuno ha pensato al motivo per cui così tanti di noi ripetono questo stesso schema usando gli stessi nomi di variabili?

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

Sembra che la maggior parte del codice che abbia mai guardato usi i, j, ke così via come variabili di iterazione.

Suppongo di averlo raccolto da qualche parte, ma mi chiedo perché questo sia così prevalente nello sviluppo del software. È qualcosa che tutti abbiamo raccolto da C o qualcosa del genere?

Solo un prurito che ho avuto per un po 'nella parte posteriore della mia testa.


4
Già chiesto molto tempo fa su SO; forse quelli devono essere migrati qui: stackoverflow.com/questions/454303/... e stackoverflow.com/questions/4137785/...
BlueRaja - Danny Pflughoeft

8
È una domanda duplicata e adoro questa risposta. A causa del nome D ijk stra.
Vivart,

2
Ho sempre pensato che io, j e k venissi preso da D ijk stra
Christian Kjær il

1
BTW: Io uso sempre ii(e jj, kk...) in modo che sia più facile da individuare durante la ricerca.
Sabuncu,

1
Cos'altro useresti?
Thorbjørn Ravn Andersen il

Risposte:


205

ie in jgenere sono stati usati come pedici in un bel po 'di matematica per un po' di tempo (ad esempio, anche in articoli che precedono linguaggi di livello superiore, si vedono spesso cose come "X i, j ", specialmente in cose come una sommatoria).

Quando hanno progettato Fortran, (apparentemente) hanno deciso di consentire lo stesso, quindi tutte le variabili che iniziano con "I" fino a "N" sono predefinite su intero e tutte le altre su reale (virgola mobile). Per coloro che l'hanno perso, questa è la fonte della vecchia battuta "Dio è reale (se non dichiarato intero)".

La maggior parte delle persone sembra aver visto poche ragioni per cambiarlo. È ampiamente conosciuto e compreso e abbastanza succinto. Ogni tanto vedi qualcosa di scritto da uno psicotico che pensa che ci sia un vero vantaggio in qualcosa come:

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;

Per fortuna questo è piuttosto raro, e la maggior parte delle guide di stile ora sottolinea che mentre i nomi di variabili descrittivi lunghi possono essere utili, non sempre hai bisogno di loro, specialmente per qualcosa come questo in cui l'ambito della variabile è solo una riga o due di codice .


13
+1 Non avevo pensato alla correlazione matematica qui. Questa è stata una realizzazione interessante.
Casey Patton,

79
+1 per attribuire alla psicosi ciò che alcuni immaginano essere stile.
Crashworks,

2
OK - allora perché io e j siamo usati come pedici in matematica? Penso che questo uso sia precedente a FORTRAN :-) Sono sicuro che Knuth lo sa ...
Guy Sirton,

34
@Guy 'i' è per indice, j è la lettera successiva dopo i
Martin Beckett,

3
i e j stanno bene o addirittura preferibili nella maggior parte dei casi, come alludeva Jerry. Un problema più grande sono i loop che sono così grandi che non puoi vedere e comprendere tutto su uno schermo. Questi devono essere rifattorizzati in modo da essere più concisi.
Craig,

63

i - indice.

Una variabile temporanea utilizzata per l'iterazione del ciclo di indicizzazione. Se si dispone già di una i, cosa c'è di più naturale che andare a j, ke così via?

Anche in quel contesto idxviene spesso usato.

Breve, semplice e mostra esattamente quale sia l'utilizzo della variabile, come dovrebbe essere il nome della variabile.


35
ijk = "Sto solo scherzando". :-)
Mahmoud Hossam,

2
puoi citare un riferimento?
Louis Rhys,

23
Puoi citarmi come riferimento se vuoi.
Captain Sensible,

1
Forse vale la pena aggiungere che spesso è letteralmente un indice (pedice) in un array a cui si accede nel ciclo. Non sempre, ma se lo si visualizza come un indice nelle interazioni o meno, è comunque conveniente generalizzare da una classe comune di loop a una classe più ampia di loop. A proposito, bizzarria personale, per me "indice" tende a implicare qualcosa di simile a "indice di database", compresi i dizionari da chiave a pedice / tabelle invertite in memoria, quindi preferisco "pedice" piuttosto che "indice" per evitare l'ambiguità. Ma lo uso ancora iper i loop.
Steve314,

3
Nel tuo treno di pensieri ipotrebbe significare anche iteratore.
totymedli,

39

In FORTRAN è istata la prima lettera a default al tipo intero. L'intera gamma di tipi interi impliciti era qualsiasi a partire dalle lettere ia n. Lavorare con i loop per tre dimensioni ci ha portato i, je k. Il modello è continuato per dimensioni aggiuntive. Allo stesso modo, 'x', 'y', e 'z' che erano predefiniti come virgola mobile dove venivano usati per le variabili loop che richiedevano numeri reali.

Come litleadvnota, iè anche una contrazione minima per l'indice.

Dato l'uso locale di queste variabili, non vedo un problema non usare un nome più descrittivo.


Per i singoli loop sono d'accordo, ma per i loop che contengono loop mi piace un po 'più di descrizione.
Edward Strange,

1
Alla fine la risposta è inerzia . Ho iniziato a farlo con WATFOR (Waterloo FORTRAN) nel 1973 e ... lo sto ancora facendo nel 2011.
Peter Rowell,

1
@Crazy Eddie: se i loop contengono molte funzionalità, sarei d'accordo. Ma con loop strettamente nidificati, la lunghezza del codice dovrebbe essere dell'ordine di n + 1 o 2n + 1 dove n è il numero di dimensioni. In tal caso, nomi di variabili più lunghi possono ridurre la leggibilità.
BillThor,

11
+1 per "In Fortran" perché è così che è iniziata quella tradizione - non importa se ti piace Fortran o no.
Artem

34

Credo che provenga dalla sintesi :

Somma


3
Interessante! Questo precede FORTRAN, ma nel contesto di CS?
kprobst,

3
Poiché Backus ha avuto un Master in matematica, sembra logico.
dbasnett,

9
La maggior parte dei primi geni del CS erano in matematica o ingegneria elettrica, il che richiedeva un'estesa matematica. Ancora oggi, il tuo "secchione di computer" medio ha in genere abilità matematiche sopra la media, perché matematica e computer sono orientati in modo logico.
corsiKa

8

Mi è stato detto, a parte la mia teoria del professore di calcolo un paio di anni fa, che l'origine proveniva dalla notazione matematica della sommatoria. i, j, k erano comunemente usati come variabili di iterazione intere e si trasferivano dai primi testi sulla teoria del calcolo (che ovviamente è principalmente la matematica applicata). Apparentemente guardando il lavoro di Knuth et al. lo supporta.

x, y, z come iteranti in virgola mobile apparentemente arrivarono con la popolarità di Fortran nelle scienze fisiche, da ricercatori di fisica che convertivano integrali in codice sorgente (poiché le integrazioni erano comunemente al di sopra dei limiti spaziali ... come x va a 100 et cetera)

Non ho un riferimento per sostenerlo, ma come ho detto, proveniva da un professore abbastanza vecchio e sembra avere molto senso.

Spero che sia di aiuto


6

Penso che i, j, k siano usati in matematica per indicare gli indici nelle sommazioni e per gli elementi della matrice (i per le righe e j per le colonne). Nella notazione matematica, alcune lettere tendono ad essere usate con un significato specifico più spesso di altre, ad esempio a, b, c per costanti, f, g, h per funzioni, x, y, z per variabili o coordinate, i, j, k per gli indici. Almeno questo è ciò che ricordo dalla matematica che ho preso a scuola.

Forse questa notazione è stata trasferita all'informatica perché all'inizio molti scienziati informatici erano matematici o almeno avevano un forte background matematico.


3

i == iteratore o indice

La mia comprensione è sempre stata 'i' è una buona scelta poiché i loop sono in genere per iterare o attraversare con un passaggio dell'indice noto. Le lettere 'j' e 'k' seguono bene poiché sono spesso necessari cicli annidati e la maggior parte conoscerà istintivamente 'j' == secondo indice e 'k' == terzo indice poiché seguono tale schema nell'alfabeto. Inoltre, con molti che seguono questa convenzione standard, si può presumere che un ciclo "k" probabilmente avrà un ciclo "j" e "i" che lo avvolge.


1

i, j, k sono utilizzati nel sistema di coordinate cartesiane. Confrontando con xey che rappresentano gli assi nello stesso sistema e che sono sempre usati come variabili, possiamo dire che anche i, j e k provengono da lì.


1

"i" è per indice.

Una sola lettera semplifica la scansione della riga di codice. Per qualcosa di così comune come loop, un singolo carattere per l'indice è l'ideale. Non c'è confusione sul significato di "i" dovuto alla convenzione.


0

Quando ho iniziato a programmare, Dartmouth BASIC era nuovo. Tutte le variabili in questa e in alcune altre lingue all'epoca erano caratteri singoli. Aggiungete a ciò la convenzione di denominazione delle variabili FORTRAN e il fatto che è molto più semplice digitare, solo un carattere e la comprensione da parte di programmatori e insegnanti più anziani. Non lo so, ma suona bene.

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.