Warum verwenden die meisten von uns 'i' als Schleifenzählervariable?

126

Hat jemand darüber nachgedacht, warum so viele von uns dasselbe Muster mit denselben Variablennamen wiederholen?

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

Es scheint, dass der meiste Code, den ich je gesehen habe, verwendet iwird j, kund so weiter als Iterationsvariablen.

Ich nehme an, ich habe das irgendwo aufgegriffen, aber ich frage mich, warum das in der Softwareentwicklung so verbreitet ist. Ist es etwas, was wir alle von C aufgegriffen haben oder so?

Nur ein Juckreiz, den ich schon eine Weile im Hinterkopf hatte.

kprobst
quelle
4
Bereits vor langer Zeit auf SO gefragt; Vielleicht sollten diese hier migriert werden: stackoverflow.com/questions/454303/… und stackoverflow.com/questions/4137785/…
BlueRaja - Danny Pflughoeft
8
Es ist eine doppelte Frage und ich liebe diese Antwort. Wegen des Namens D ijk stra.
Vivart
2
Ich dachte immer, i, j und k von von D genommen wurde ijk stra
Christian Kjær
1
BTW: Ich benutze immer ii(und jj, kk...) , so dass es leichter zu finden , ist bei der Suche.
Sabuncu
1
Was würden Sie sonst noch verwenden?
Thorbjørn Ravn Andersen

Antworten:

205

iund jwerden in der Regel seit geraumer Zeit in Mathematik als Index verwendet (z. B. sehen Sie auch in Aufsätzen, die älter sind als höhere Sprachen, häufig Dinge wie "X i, j ", insbesondere in Dingen wie einer Summierung).

Als sie Fortran entworfen haben, haben sie (anscheinend) beschlossen, dasselbe zuzulassen, sodass für alle Variablen, die mit "I" bis "N" beginnen, standardmäßig eine Ganzzahl und für alle anderen eine reelle Zahl (Gleitkommazahl) festgelegt ist. Für diejenigen, die es verpasst haben, ist dies die Quelle des alten Witzes "Gott ist real (es sei denn, es wird eine Ganzzahl angegeben)".

Die meisten Menschen scheinen wenig Grund gesehen zu haben, dies zu ändern. Es ist allgemein bekannt und verstanden und ziemlich prägnant. Von Zeit zu Zeit sieht man etwas, das von einem Psychotiker geschrieben wurde, der denkt, dass etwas einen echten Vorteil hat:

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;

Zum Glück ist dies recht wenn auch selten, und die meisten Styleguides jetzt darauf hin , dass während lange, beschreibende Variablennamen können nützlich sein, Sie nicht immer sie brauchen, vor allem für so etwas wie dies in dem Anwendungsbereich der Variable nur eine oder zwei Zeilen von Code .

Jerry Coffin
quelle
13
+1 Ich hatte hier nicht über die mathematische Korrelation nachgedacht. Dies war eine interessante Erkenntnis.
Casey Patton
79
+1 für die Zuordnung zu Psychose, was einige sich als Stil vorstellen.
Crashworks
2
OK - warum werden i und j in der Mathematik als Index verwendet? Ich denke, diese Verwendung ist älter als FORTRAN :-) Ich bin sicher, Knuth weiß ...
Guy Sirton
34
@Guy 'i' ist für Index, j ist der nächste Buchstabe nach i
Martin Beckett
3
i und j sind in den meisten Fällen in Ordnung oder sogar vorzuziehen, wie Jerry anspielte. Ein größeres Problem sind Schleifen, die so groß sind, dass Sie nicht alles auf einem Bildschirm sehen und nachvollziehen können. Diese müssen überarbeitet werden, damit sie prägnanter sind.
Craig,
63

i - Index.

Eine temporäre Variable, die zum Indizieren der Schleifeniteration verwendet wird. Wenn Sie bereits haben i, was ist natürlicher , als gehen j, kund so weiter?

In diesem Zusammenhang idxwird häufig auch verwendet.

Kurz, einfach und zeigt genau, wie die Verwendung der Variablen ist, wie der Variablenname sein sollte.

littleadv
quelle
35
ijk = "Ich mache nur Spaß". :-)
Mahmoud Hossam
2
Können Sie eine Referenz zitieren?
Louis Rhys
23
Sie können mich als Referenz zitieren, wenn Sie wollen.
Captain Sensible
1
Vielleicht lohnt es sich hinzuzufügen, dass es sich oft buchstäblich um einen Index (Index) in einem Array handelt, auf das in der Schleife zugegriffen wird. Nicht immer, aber ob Sie es als Index für die Interaktionen betrachten oder nicht, es ist immer noch praktisch, von einer allgemeinen Schleifenklasse auf eine breitere Schleifenklasse zu verallgemeinern. Übrigens: "Index" bedeutet für mich eher "Datenbankindex", einschließlich der Schlüsselwörterbücher / invertierten Tabellen im Speicher. Ich bevorzuge "Index", um Mehrdeutigkeiten zu vermeiden. Aber ich benutze immer noch ifür Schleifen.
Steve314
3
In Ihrem Gedankengang ikönnte dies auch Iterator bedeuten.
Totymedli
39

In FORTRAN iwurde als erster Buchstabe standardmäßig der Integer-Typ verwendet. Die gesamte Palette der impliziten Ganzzahltypen begann mit den Buchstaben ibis n. Arbeiten mit Schlaufen für drei Dimensionen hat uns i, jund k. Das Muster wurde für zusätzliche Abmessungen fortgesetzt. Ebenso wurden 'x', 'y' und 'z', die standardmäßig als Gleitkomma verwendet wurden, für Schleifenvariablen verwendet, für die reelle Zahlen erforderlich waren.

Wie litleadvbemerkt, iist auch eine minimale Kontraktion für den Index.

Angesichts der lokalen Verwendung dieser Variablen sehe ich kein Problem darin, keinen aussagekräftigeren Namen zu verwenden.

BillThor
quelle
Für einzelne Loops stimme ich zu, aber für Loops, die Loops enthalten, mag ich etwas mehr Beschreibung.
Edward Strange
1
Letztendlich lautet die Antwort Trägheit . Ich habe 1973 angefangen, es mit WATFOR (Waterloo FORTRAN) zu machen und ... ich mache es immer noch 2011.
Peter Rowell
1
@ Crazy Eddie: Wenn die Loops viel Funktionalität enthalten, würde ich zustimmen. Bei eng verschachtelten Schleifen sollte die Länge des Codes in der Größenordnung von n + 1 oder 2n + 1 liegen, wobei n die Anzahl der Dimensionen ist. In diesem Fall können längere Variablennamen die Lesbarkeit beeinträchtigen.
BillThor
11
+1 für "In Fortran", denn so hat diese Tradition begonnen - es spielt keine Rolle, ob Sie Fortran mögen oder nicht.
Artem
34

Ich glaube es kommt aus der Summation :

Summe

Raphael
quelle
3
Interessant! Dies ist älter als FORTRAN, aber im Kontext von CS?
kprobst
3
Da Backus einen Master in Mathematik hatte, erscheint dies logisch.
Dbasnett
9
Die meisten frühen CS-Genies befassten sich entweder mit Mathematik oder Elektrotechnik, was umfangreiche Mathematik erforderte. Sogar heute hat ein durchschnittlicher "Computer-Nerd" normalerweise überdurchschnittliche mathematische Fähigkeiten, weil Mathematik und Computer so logisch orientiert sind.
corsiKa
8

Abgesehen von meiner Theorie des Rechenprofessors vor ein paar Jahren wurde mir gesagt, dass der Ursprung in der mathematischen Summationsnotation lag. i, j, k wurden häufig als ganzzahlige Iterationsvariablen verwendet und wurden aus den frühen Texten zur Berechnungstheorie übernommen (die natürlich in erster Linie die angewandte Mathematik ist). Offenbar auf die Arbeit von Knuth et al. sichert dies.

x, y, z als Gleitkomma-Iteranten kamen anscheinend mit der Popularität von Fortran in den physikalischen Wissenschaften von Physikerforschern, die Integrale in Quellcode umwandelten (da Integrationen gewöhnlich über räumliche Grenzen gingen ... wie x zu 100 und so weiter).

Ich habe keine Referenz, um dies zu belegen, aber wie ich schon sagte, stammte es von einem ziemlich alten Professor und scheint sehr sinnvoll zu sein.

Hoffe das hilft

Stephen
quelle
6

Ich denke, i, j, k werden in der Mathematik verwendet, um Indizes in Summationen und für Matrixelemente anzugeben (i für die Zeilen und j für die Spalten). In der mathematischen Notation werden einige Buchstaben häufiger mit einer bestimmten Bedeutung verwendet als andere, z. B. a, b, c für Konstanten, f, g, h für Funktionen, x, y, z für Variablen oder Koordinaten, i, j, k für Indizes. Zumindest erinnere ich mich an die Mathematik, die ich in der Schule gemacht habe.

Vielleicht wurde diese Notation auf das Rechnen übertragen, weil viele Informatiker zu Beginn Mathematiker waren oder zumindest einen starken mathematischen Hintergrund hatten.

Giorgio
quelle
3

I == Iterator oder Index

Ich habe immer verstanden, dass 'i' eine gute Wahl ist, da Schleifen normalerweise zum Iterieren oder Durchlaufen mit einem bekannten Indexschritt dienen. Die Buchstaben 'j' und 'k' folgen gut, da häufig verschachtelte Schleifen benötigt werden und die meisten instinktiv 'j' == zweiter Index und 'k' == dritter Index kennen, da sie diesem Muster im Alphabet folgen. Wenn viele dieser Standardkonvention folgen, kann man sicher annehmen, dass eine 'k'-Schleife wahrscheinlich eine' j'- und eine 'i'-Schleife haben wird, die sie umschließen.

jimp
quelle
1

i, j, k werden im kartesischen Koordinatensystem verwendet. Im Vergleich zu x und y, die Achsen desselben Systems darstellen und immer als Variablen verwendet werden, können wir sagen, dass i, j und k ebenfalls von dort stammen.

Sergey
quelle
1

"i" steht für index.

Ein einzelner Buchstabe erleichtert es Ihrem Auge, die Codezeile zu scannen. Für etwas, das so häufig ist wie eine Schleife, ist ein einzelnes Zeichen für den Index ideal. Es gibt keine Verwirrung darüber, was "ich" aufgrund der Konvention bedeutet.

jojo
quelle
0

Als ich anfing zu programmieren, war Dartmouth BASIC neu. Alle Variablen in dieser und einigen anderen Sprachen waren zu diesem Zeitpunkt einzelne Zeichen. Hinzu kommt die FORTRAN-Variablennamenskonvention und die Tatsache, dass es viel einfacher ist, nur ein Zeichen einzugeben, sowie das Verständnis älterer Programmierer und Lehrer. Ich weiß es nicht, aber es hört sich gut an.

Dave
quelle