Pourquoi les variables «i» et «j» sont-elles utilisées pour les compteurs?

179

Je sais que cela peut sembler une question absolument idiote à poser, mais je suis trop curieux pour ne pas la poser ...

Pourquoi "i" et "j" sont-ils devenus LES variables à utiliser comme compteurs dans la plupart des structures de contrôle?

Bien que le bon sens me dise qu'ils sont exactement comme X, qui est utilisé pour représenter des valeurs inconnues, je ne peux m'empêcher de penser qu'il doit y avoir une raison pour laquelle tout le monde est enseigné de la même manière encore et encore.

Est-ce parce qu'il est en fait recommandé pour les meilleures pratiques, ou pour une convention, ou y a-t-il une raison obscure derrière cela?

Juste au cas où, je sais que je peux leur donner le nom que je veux et que les noms de variables ne sont pas pertinents.

Carlos
la source
17
i = itération pendant que j = après l'interation
ajreal
7
étrange «c» n'a pas été choisi? comme dans le registre de compteur Intel «cx».
12
Coordonnées cartésiennes
Nick Dandoulakis
16
Pourquoi les questions réelles deviennent-elles des wikis communautaires simplement parce qu'elles sont populaires? Cela rappelle beaucoup le communisme. Si quelqu'un invente quelque chose de vraiment cool, le gouvernement vole l'invention pour la partager avec la communauté.
orokusaki
9
Fermé dans le mauvais sens: les réponses ici sont plus informatives que les autres qn ...
Charles Stewart

Réponses:

330

Cela vient finalement des mathématiques: la notation de sommation utilise traditionnellement i pour le premier indice, j pour le second, et ainsi de suite. Exemple (à partir de http://en.wikipedia.org/wiki/Summation ):

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

Il est également utilisé de cette façon pour des collections de choses, comme si vous avez un tas de variables x 1 , x 2 , ... x n , alors une variable arbitraire sera connue sous le nom de x i .

Quant à savoir pourquoi c'est ainsi, j'imagine que SLaks est correct et c'est parce que je suis la première lettre de Index.

zwol
la source
93
@SLott: Et pourquoi est-il iutilisé en mathématiques?
SLaks
13
@Slaks: C'est une bonne question. Je pense en fait que "i" pourrait provenir d'un entier plus que d'un index. Je pense aussi que c'est facile d'écrire sur un tableau. Dans les années 70, nous avons été avertis de nous assurer que nous écrivions nos «i» et «j» d'une manière parfaitement distinctive. En effet, on nous a dit de dessiner notre "i" exactement comme un "j" en arrière pour être parfaitement clair à ce sujet.
S.Lott
26
@ S.Lott: Je doute que cela vienne d'un entier. Nous utilisons ℤ (tableau noir en gras Z) pour les nombres entiers car il représente le mot allemand Zahlen , qui signifie des nombres . En supposant que la notation de sommation est apparue à peu près au même moment, la notation basée en allemand serait attendue - et le mot allemand pour index est Index , qui commence également par un i . Et je ne peux pas penser à beaucoup de lettres qui sont particulièrement difficiles à écrire sur un tableau. Eh bien, sauf ξ :-)
Antal Spector-Zabusky
14
"Cette convention existe parce que cette convention a existé auparavant." C'est un peu comme ça que fonctionne l'étymologie: personne ne sait pourquoi un bruit particulier avait une signification particulière dans PIE. Ce serait bien d'expliquer la convention mathématique, mais la question est "pourquoi sont-ils utilisés comme compteurs dans les structures de contrôle", donc jusqu'à ce que quelqu'un produise une réponse qui remonte plus loin, c'est la meilleure. Il spécule au moins pourquoi il est utilisé en mathématiques. Un historien mathématique approprié pourrait le découvrir, peut-être en utilisant un hachage binaire. Euclide ne l'a pas utilisé, je parie que von Neumann l'a fait. Et Cauchy? Il a beaucoup utilisé les index
Steve Jessop
14
Je pense que c'est Lagrange qui a recommandé d'utiliser a, b, c pour les constantes d'une fonction, et x, y, z pour les variables d'une fonction. i, j, k désignent les «directions» d'un vecteur, et les facteurs d'une somme formelle comme celle-ci peuvent être interprétés comme des degrés de liberté [directions, par un autre nom] de l'équation.
David
200

Je crois que cela remonte à Fortran. Les variables commençant par I à Q étaient des nombres entiers par défaut, les autres étaient réelles. Cela signifiait que Ic'était la première variable entière, et Jla seconde, etc., donc ils sont tombés vers l'utilisation dans les boucles.

Ignacio Vazquez-Abrams
la source
53
Je pense que cela vient de la façon dont les mathématiciens semblent aimer utiliser i, j, k comme indices pratiques pour les indices de sommation et de multiplication matricielle, etc. Je me souviens avoir lu quelque chose à ce sujet dans un des premiers manuels de Fortran II. (Oui, Fortran II.)
S.Lott
5
Oui, FORTRAN est à l'origine de ces conventions.
Jé Queue
9
On m'a enseigné Ipar Nnon Q. Google semble plutôt d'accord. (différentes versions de FORTRAN?)
Hugh Allen
2
Et tout le reste à Fortran était, par défaut, réel. Ce qui conduit à la blague "Dieu est réel, sauf s'il est déclaré entier".
Lagerbaer
4
@learnvst - parce que les mathématiciens utilisaient i, j depuis au moins un siècle auparavant.
Martin Beckett
195

Les mathématiciens utilisaient i, j, k pour désigner des entiers en algèbre (indices, séries, sommations, etc.) bien avant (par exemple 1836 ou 1816 ) les ordinateurs (c'est à l'origine des valeurs par défaut du type de variable FORTRAN). L'habitude d'utiliser les lettres de la fin de l'alphabet (..., x, y, z) pour les variables inconnues et depuis le début (a, b, c ...) pour les constantes est généralement attribuée à René Descartes , (voir aussi ici ) donc je suppose que i, j, k ... n (au milieu de l'alphabet) pour les entiers est probablement dû à lui aussi.

timday
la source
17
Pour moi, c'est clairement la meilleure réponse. (Mention honorable pour la réponse de Michael Borgwardt, qui cite également des conventions mathématiques mais n'est pas aussi spécifique.) Je suis désolé que la vôtre ne soit pas acceptée. Tout ce que je peux faire, c'est lui donner mon vote pour.
John Y
3
C'est exactement la raison pour laquelle nous devons pouvoir voter pour une réponse acceptée par la communauté (et oui, je sais que cela appartient à uservoice).
Kredns
Il h. Je mets à jour occasionnellement le lien vers un ancien livre Google dans cette réponse, car Google continue de couper des choses. Par hasard, je note que le document de 1816 maintenant lié inclut Charles Babbage (probablement lui de la renommée du moteur de différence / moteur d'analyse) en tant qu'auteur. C'est donc sans doute un exemple de la première utilisation d'une variable entière "i" par un programmeur informatique: ^)
timday
..OK le lien 1816 ne va pas à la page avec "i" utilisé dessus, mais ils sont là.
1er
129

i = entier

Vient de Fortran où les variables entières devaient commencer par les lettres I à N et les variables réelles commençaient par les autres lettres. Ainsi, j'étais le premier et le plus court nom de variable entier. Fortran était l'un des premiers langages de programmation largement utilisés et les habitudes développées par les programmeurs qui l'utilisaient se sont reportées à d'autres langages.

EDIT : Je n'ai aucun problème avec la réponse que cela dérive des mathématiques. C'est sans doute là que les designers Fortran ont pu s'inspirer. Le fait est, pour moi en tout cas, quand j'ai commencé à programmer en Fortran, nous avons utilisé I, J, K, ... pour les compteurs de boucles car ils étaient courts et les premiers noms de variables légalement autorisés pour les entiers. En deuxième année à HS, j'avais probablement entendu parler de Descartes (et de très peu d'autres), mais je faisais très peu de liens avec les mathématiques lors de la programmation. En fait, le premier cours que j'ai suivi s'appelait "Fortran for Business" et n'était pas enseigné par la faculté de mathématiques, mais par la faculté de commerce / économie.

Pour moi, au moins, la dénomination des variables n'avait pas grand-chose à voir avec les mathématiques, mais tout était dû aux habitudes que j'avais prises pour écrire du code Fortran que je portais dans d'autres langues.

tvanfosson
la source
4
Je suis presque sûr que c'était FORTRAN.
Cade Roux
4
Ya, fortran ..... Il pourrit l'esprit. Nous avons un programmeur qui utilise i ii et iii comme noms de variables de boucle. L'autre symptôme est des noms de variables / fonctions à 6 caractères sans voyelles.
EvilTeach
4
@tvan, je suis à peu près sûr que les variables commençant par I à N par défaut sont des nombres entiers, mais vous pouvez toujours les déclarer réels, d'où la blague "Dieu est réel, sauf si un entier déclaré". +1 de toute façon, puisque mon souvenir d'il y a tant d'années n'est peut-être PAS parfait.
paxdiablo
10
Hé, les gars de FORTRAN l'ont enlevé aux mathématiciens!
timday
6
Je suis d'accord avec @timday. Utiliser i comme indice d'une série est une pratique pratiquée par les mathématiciens depuis au moins 2 siècles.
Scottie T
91

isignifie I ndex.
jvient après i.

SLaks
la source
12
Je pense qu'il parlait d'alphabet, essayez d'utiliser un peu d'imagination :)
Jack
33
@Jack: Je pense que @Pete plaisantait ;-)
Chris Pfohl
13
@Cpfohl: oui, je voulais juste être ennuyeux: D
Jack
4
@Pete Kirkham: Merci beaucoup Pete, c'était le meilleur rire que j'ai eu le mois dernier.
AMissico
@SLaks ... Je crois que vous avez raison i = Index qui provient de la notation d'index utilisée dans Math en.wikipedia.org/wiki/Index_notation ou voici une belle référence physics.ucsb.edu/~physCS31/fall2010/index- notation.pdf
John Hartsock
63

Ces symboles étaient utilisés comme index matriciels en mathématiques bien avant l'invention des ordinateurs électroniques.

Erickson
la source
52

Je pense qu'il est très probablement dérivé de l'index (au sens mathématique ) - il est couramment utilisé comme index dans les sommes ou d'autres opérations basées sur des ensembles, et a probablement été utilisé de cette façon depuis avant qu'il y ait des langages de programmation.

Michael Borgwardt
la source
Bonne réponse. Cela (pour moi) semble en effet l'explication la plus probable.
Noldorin
3
Ouaip. La notation mathématique pour une somme comme Y = Σ Xiprécède chaque langage de programmation.
Treb
Je pense à l' index à chaque fois que j'utilise i. Mais à l'origine je l'utilise principalement parce que tout le code que je regarde ailleurs l'utilise, et cela peut être hérité des programmeurs Fortran ...
awe
47

Il existe une préférence en mathématiques pour l'utilisation de lettres consécutives dans l'alphabet pour les variables «anonymes» utilisées de manière similaire. Par conséquent, pas seulement "i, j, k", mais aussi "f, g, h", "p, q, r", "x, y, z" (rarement avec "u, v, w" en préfixe), et "α, β, γ".

Or "f, g, h" et "x, y, z" ne sont pas utilisés librement: le premier est pour les fonctions, le second pour les dimensions. "p, q, r" sont également souvent utilisés pour les fonctions.

Ensuite, il y a d'autres contraintes sur les séquences disponibles: "l" et "o" sont évités, car ils ressemblent trop à "1" et "0" dans de nombreuses polices. "t" est souvent utilisé pour le temps, "d & δ" pour les différentiels et "a, s, m, v" pour les mesures physiques de l'accélération, du déplacement, de la masse et de la vitesse. Cela ne laisse pas autant de lacunes de trois lettres consécutives sans associations indésirables en mathématiques pour les indices.

Ensuite, comme plusieurs autres l'ont remarqué, les conventions mathématiques ont eu une forte influence sur les conventions de programmation précoces, et «α, β, γ» n'étaient pas disponibles dans de nombreux jeux de caractères anciens.

Charles Stewart
la source
2
D'accord. Bien que, a, b, cest une séquence assez couramment utilisée malgré aavoir plusieurs significations ...
Stobor
32

J'ai trouvé une autre réponse possible qui pourrait être que i, j et k viennent Hamilton's Quaternions.

texte alternatif

Euler a choisi i pour l'unité imaginaire.

Hamilton avait besoin de deux autres racines carrées de -1: ii = jj = kk = ijk = -1

Hamilton était vraiment influent, et les quaternions étaient le moyen standard de faire une analyse 3D avant 1900. À l'époque, les mathématiciens avaient l'habitude de penser à (ijk) comme un ensemble apparié. Le calcul vectoriel a remplacé l'analyse quaternionique dans les années 1890 car c'était une meilleure façon d'écrire les équations de Maxwell. Mais les gens avaient tendance à écrire les quantités vectorielles comme ceci: (3i-2j+k) au lieu de (3,-2,1) . Donc (ijk) est devenu le vecteur de base standard dans R ^ 3.

Enfin, les physiciens ont commencé à utiliser la théorie des groupes pour décrire les symétries dans les systèmes d'équations différentielles. Donc (ijk) a commencé à connoter "des vecteurs qui sont permutés par des groupes de permutation", puis a dérivé vers "des éléments de type index qui prennent toutes les valeurs possibles dans un ensemble spécifié", ce qui est fondamentalement ce qu'ils signifient dans une boucle for.

Carlos
la source
11
enfin une approche différente de la question, point intéressant +1
Fabian
30

en rejetant (un peu biaisé)

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
la source
3
Je vois n comme number, généralement le nombre d'éléments dans un ensemble.
Tom Leys
6
Oh les hommes, et qu'est-ce que XXX semble être? )) +1 pour la créativité;)
Hovhannes Grigoryan
Parfois, je suis heureux que la plupart du temps, je n'ai pas à me soucier des types de mnémoniques que d'autres personnes proposent dans leur tête pour des choses comme ça ...
Thies Heidecke
21

Un après-midi ensoleillé, Archimède réfléchit ( comme d'habitude pour les après-midi ensoleillés ) et se heurte à son copain Eratosthène.

Archimède a dit: "Archimède à Eratosthène saluant! J'essaie de trouver une solution au rapport de plusieurs corps rigides sphériques en équilibre. Je souhaite parcourir ces corps plusieurs fois, mais je passe un temps affreux à suivre du nombre d'itérations que j'ai effectuées! "

Ératosthène a dit: "Pourquoi Archimède, prune mûre d'un gamin, vous pourriez simplement marquer des rangées successives de lignes dans le sable, chacune gardant une trace du nombre d'itérations que vous avez faites dans l'itération!"

Archimède a crié au monde que son grand ami était indéniablement un phare d'intelligence pour avoir trouvé une solution aussi simple. Mais Archimède a remarqué qu'il aimait marcher en rond autour de son bac à sable pendant qu'il réfléchissait. Ainsi, il y avait un risque de perdre la trace de quelle ligne était en haut et laquelle était en bas.

"Peut-être que je devrais marquer ces lignes avec une lettre de l'alphabet juste à côté pour que je sache toujours quelle ligne est laquelle! Que pensez-vous de cela?" il a demandé, puis a ajouté, "Mais Eratosthène ... quelles lettres dois-je utiliser?"

Ératosthène était sûr de ne pas savoir quelles lettres seraient les meilleures et il en dit autant à Archimède. Mais Archimède n'était pas satisfait et continuait d'inciter le pauvre bibliothécaire à choisir, au moins, les deux lettres dont il aurait besoin pour sa solution actuelle d'équilibre de sphère.

Ératosthène, enfin fatigué de la demande incessante de deux lettres, a crié: "JE NE SAIS PAS !!!"

Archimède a donc choisi les deux premières lettres de la phrase exclamative d'Ératosthène et a remercié son ami pour sa contribution.


Ces symboles ont été rapidement adoptés par les anciens développeurs grecs de Java, et le reste est, eh bien ... de l'histoire.

Brendan
la source
6
... et avait la lettre j.
Andrew Grimm
Wow, cela ressemble presque à l'histoire d'une tortue et d'Achille du GEB de Hofstadter
ProfK
15

je pense que c'est parce que beaucoup de boucles utilisent une variable de type Int pour faire le comptage, comme

for (int i = 0; etc

et quand vous tapez, vous le dites dans votre tête (comme lorsque vous lisez), donc dans votre esprit, vous dites «int ...»

et quand vous devez composer une lettre juste après ce 'int ....', vous dites / tapez le 'i' parce que c'est la première lettre à laquelle vous pensez quand vous venez de dire 'int'

comme si vous épelez un mot à des enfants qui commencent à apprendre à lire, vous épelez des mots pour eux en utilisant des noms, comme ceci:

WORD épelle William W, Ok O, Ruby R, Done D

Vous dites donc Int I, Double d, Float f, string s etc. en fonction de la première lettre.

Et j est utilisé parce que lorsque vous avez fait int I, J suit juste après.

Michel
la source
7
iest antérieure à cette syntaxe.
SLaks
1
C'est un excellent moyen de confondre la merde d'un enfant; vous apprenez vraiment à épeler comme ça?!
Courses de légèreté en orbite le
14

Je pense que c'est une combinaison des autres raisons mentionnées:

Pour commencer, `` i '' était couramment utilisé par les mathématiciens dans leur notation, et aux débuts de l'informatique avec des langages qui n'étaient pas binaires (c'est-à-dire qu'ils devaient être analysés et lexisés d'une certaine manière), la grande majorité des utilisateurs d'ordinateurs étaient aussi des mathématiciens (... et des scientifiques et des ingénieurs), donc la notation est tombée en usage dans les langages informatiques pour la programmation de boucles, et est restée en quelque sorte bloquée depuis.

Combinez cela avec le fait que l'espace d'écran à ces tout premiers jours était très limité, tout comme la mémoire, il était logique de conserver des noms de variables plus courts.

Alex Marshall
la source
13

Peut-être historique?

FORTRAN, probablement le premier langage de haut niveau, défini par défaut i, j, k, l, m comme des types de données Integer, et les boucles ne peuvent être contrôlées que par une variable entière, la convention continue?

par exemple:

faire 100 i = j, 100,5 .... 100 continuer ....

Brett
la source
FWIW, je saute généralement la lettre l car elle ressemble trop au chiffre 1.
Nosredna
13

i = itérateur, i = index, i = entier

Quelque soit votre chiffre "i" signifie qu'il "correspond toujours à la facture".

De plus, à moins que vous n'ayez qu'une seule ligne de code dans cette boucle, vous devriez probablement nommer la variable itérateur / index / entier à quelque chose de plus significatif. Comme: employeeIndex

BTW, j'utilise habituellement "i" dans mes boucles d'itérateur simples; à moins bien sûr qu'il ne contienne plusieurs lignes de code.

Chris Pietschmann
la source
13

i = iota, j = jot; les deux petits changements.

iota est la plus petite lettre de l'alphabet grec; dans la langue anglaise, sa signification est liée à de petits changements, comme dans "pas un iota" (d'une phrase du Nouveau Testament: "jusqu'à ce que le ciel et la terre passent, pas un iota, pas un point, ne passera de la loi" (Mt 5, 18)).

Un compteur représente un petit changement dans une valeur.

Et d'iota vient jot (iot), qui est aussi synonyme d'un petit changement.

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

Stephen
la source
13

Eh bien des mathématiques: (pour les lettres latines)

a, b: utilisé comme constantes ou comme nombres entiers pour un nombre rationnel
c: une constante
d: dérivée
e: nombre d'Euler
f, g, h: les fonctions
i, j, k: sont des indices (également des vecteurs unitaires et les quaternions)
l: généralement pas utilisé. ressemble à 1
m, n: sont des lignes et des colonnes de matrices ou comme des entiers pour les nombres rationnels
o: également non utilisé (sauf si vous êtes en petite notation o)
p, q: souvent utilisé comme nombres premiers
r: parfois un changement spatial de variable d'autres instants liés aux nombres premiers
s, t: variables spatiales et temporelles ou s est utilisé comme changement de variable pour t
u, v, w: changement de variable
x, y, z: variables

MaDMaD Mad
la source
11

De nombreuses raisons principales possibles, je suppose:

  • les mathématiciens utilisent iet jpour les Nombres Naturels dans les formules (ceux qui utilisent rarement les Nombres Complexes , du moins), donc cela est reporté à la programmation
  • de C , des iindices à int. Et si vous avez besoin une autre intpuis i2est juste trop long, donc vous décidez d'utiliser j.
  • il y a des langues où la première lettre décide du type, puis iest un integer.
Towi
la source
10

Il vient de Fortran, où i, j, k, l, m, n sont implicitement des entiers.

Walter Bright
la source
7

Cela vient certainement des mathématiques, qui ont longtemps précédé la programmation informatique.

Alors, d'où venait-elle en mathématiques? Ma supposition totalement ignorée est que c'est comme l'a dit un collègue, les mathématiciens aiment utiliser des groupes alphabétiques pour des choses similaires - f, g, h pour les fonctions; x, y, z pour les variables numériques; p, q, r pour les variables logiques; u, v, w pour les autres ensembles de variables, en particulier en calcul; a, b, c pour beaucoup de choses. i, j, k est pratique pour les variables itératives, et cela épuise les possibilités. Pourquoi pas m, n? Eh bien, ils sont utilisés pour les entiers, mais plus souvent les points de fin des itérations plutôt que les variables itératives elles-mêmes.

Quelqu'un devrait demander à un historien des mathématiques.

David Lewis
la source
6

Les compteurs sont si courants dans les programmes, et dans les premiers jours de l'informatique, tout était à une prime ... Les
programmeurs ont naturellement essayé de conserver les pixels, et le «i» nécessitait moins de pixels que toute autre lettre pour représenter. (Les mathématiciens, étant paresseux, l'ont choisi pour la même raison - comme le plus petit glyphe).
Comme indiqué précédemment, 'j' a suivi naturellement ...

:)

Gerrat
la source
24
Dans les premiers jours de calcul, les pixels n'existent .
SLaks
1
@Slaks, c'est un commentaire gagnant. Il suffit de voir le sourire sur mon visage en le lisant, et les votes. Agréable!
ProfK
"Les programmeurs ont naturellement essayé de conserver les pixels, et le 'i' nécessitait moins de pixels que n'importe quelle autre lettre à représenter." <<< c'est hilarant.
ocodo le
1
... et ainsi, une optimisation prématurée est née!
Gerrat le
4

Je l'utilise pour plusieurs raisons.

  • Habituellement, mes boucles sont basées sur des int, donc vous faites un triangle complet sur le clavier en tapant "int i" à l'exception de l'espace que je gère avec mon pouce. C'est une séquence très rapide à taper.

  • Le "i" pourrait représenter un itérateur, un entier, un incrément ou un index, chacun ayant un sens logique.

Avec mes utilisations personnelles mises de côté, la théorie selon laquelle il est dérivé de FORTRAN est correcte, où les vars entiers utilisaient les lettres I - N.

John T
la source
4

J'ai appris FORTRAN sur un Control Data Corp. 3100 en 1965. Les variables commençant par «I» à «N» étaient implicitement des nombres entiers. Ex: «IGGY» et «NORB» étaient des entiers, «XMAX» et «ALPHA» étaient des nombres à virgule flottante. Cependant, vous pouvez remplacer cela par une déclaration explicite.

Pierre
la source