Pourquoi la plupart d'entre nous utilisons-je 'comme variable de compteur de boucles?

126

Quelqu'un a-t-il réfléchi à la raison pour laquelle tant d'entre nous répètent ce même modèle en utilisant les mêmes noms de variables?

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

Il semble la plupart du code que j'ai jamais regardé les utilisations i, j, ket ainsi de suite comme variables d'itération.

Je suppose que je l’ai prise quelque part, mais je me demande pourquoi cela est si répandu dans le développement de logiciels. Est-ce quelque chose que nous avons tous pris de C ou quelque chose comme ça?

Juste une démangeaison que j'ai depuis un moment dans le dos de ma tête.

distance
la source
4
Déjà demandé il y a très longtemps sur SO; peut-être que ceux-ci devraient être migrés ici: stackoverflow.com/questions/454303/… et stackoverflow.com/questions/4137785/…
BlueRaja - Danny Pflughoeft Le
8
C'est une question en double et j'adore cette réponse. En raison du nom D ijk stra.
Vivart
2
J'ai toujours pensé que je venais de D ijk stra
Christian Kjær
1
BTW: J'utilise toujours ii(et jj, kk...) afin qu'il soit plus facile à localiser lors de la recherche.
Sabuncu
1
Quoi d'autre utiliseriez-vous?
Thorbjørn Ravn Andersen

Réponses:

205

iet jont généralement été utilisés comme indices dans un bon nombre de mathématiques pendant un bon bout de temps (par exemple, même dans des documents antérieurs à des langages de niveau supérieur, vous voyez souvent des choses comme "X i, j ", en particulier des choses comme une sommation).

Lorsqu’ils ont conçu Fortran, ils ont (apparemment) décidé d’autoriser la même chose. Ainsi, toutes les variables commençant de "I" à "N" sont définies par défaut en nombre entier et toutes les autres en valeurs réelles (virgule flottante). Pour ceux qui l'ont manqué, c'est la source de la vieille blague "Dieu est réel (sauf si déclaré entier)".

La plupart des gens semblent avoir vu peu de raisons de changer cela. C'est largement connu et compris, et assez succinct. De temps en temps, vous voyez quelque chose d'écrit par un psychotique qui pense que quelque chose comme:

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;

Heureusement, cela reste assez rare, et la plupart des guides de style soulignent maintenant que, même si de longs noms descriptifs de variables peuvent être utiles, vous n'en avez pas toujours besoin, en particulier pour quelque chose comme ceci où la portée de la variable ne représente qu'une ligne ou deux de code. .

Jerry Coffin
la source
13
+1 Je n'avais pas pensé à la corrélation mathématique ici. C'était une réalisation intéressante.
Casey Patton
79
+1 pour attribuer à la psychose ce que certains imaginent être du style.
Crashworks
2
OK - alors pourquoi i et j sont-ils utilisés comme indices en mathématiques? Je pense que cette utilisation est antérieure à FORTRAN :-) Je suis sûr que Knuth le sait ...
Guy Sirton
34
@Guy 'i' est pour index, j est la lettre suivante après i
Martin Beckett
3
i et j sont bien ou même préférables dans la plupart des cas, comme Jerry l'a mentionné. Un problème plus important réside dans les boucles si grandes que vous ne pouvez pas voir et comprendre le tout sur un seul écran. Celles-ci doivent être refactorisées pour être plus concises.
Craig le
63

i - index.

Variable temporaire utilisée pour l'itération de la boucle d'indexation. Si vous avez déjà un i, ce qui est plus naturel que d' aller j, ket ainsi de suite?

Dans ce contexte, idxon utilise souvent aussi.

Short, simple et montre exactement l'utilisation de la variable, comme le nom de la variable devrait l'être.

littleadv
la source
35
ijk = "je plaisante". :-)
Mahmoud Hossam le
2
pouvez-vous citer une référence?
Louis Rhys
23
Vous pouvez me citer comme référence si vous voulez.
Capitaine Sensible
1
Cela vaut peut-être la peine d'ajouter qu'il s'agit souvent littéralement d'un index (indice) dans un tableau auquel on accède dans la boucle. Pas toujours, mais que vous le voyiez comme un index ou non, il est toujours pratique de généraliser à partir d'une classe de boucle commune à une classe de boucle plus large. BTW - monstre personnel - pour moi "index" a tendance à impliquer quelque chose comme "index de base de données", y compris les dictionnaires clé-à-indice / tables inversées en mémoire, je préfère donc "indice" plutôt que "index" pour éviter toute ambiguïté. Mais je l' utilise encore ipour les boucles.
Steve314
3
Dans votre esprit, cela ipourrait aussi signifier itérateur.
Totymedli
39

En FORTRAN iétait la première lettre à utiliser par défaut le type entier. La gamme complète des types entiers implicites était composée de tous les éléments commençant par les lettres ià n. Travailler avec des boucles pour trois dimensions nous a i, jet k. Le motif a continué pour des dimensions supplémentaires. De même, «x», «y» et «z», qui sont définis par défaut comme virgule flottante, sont utilisés pour les variables de boucle qui nécessitent des nombres réels.

Comme les litleadvnotes, iest également une contraction minimale pour l’index.

Étant donné l'utilisation locale de ces variables, je ne vois pas de problème à ne pas utiliser un nom plus descriptif.

BillThor
la source
Je suis d'accord pour les boucles simples, mais pour les boucles contenant des boucles, j'aime un peu plus de description.
Edward Strange
1
En fin de compte, la réponse est l' inertie . J'ai commencé à le faire avec WATFOR (Waterloo Fortran) en 1973 et ... je le fais encore en 2011.
Peter Rowell
1
@Crazy Eddie: Si les boucles contiennent beaucoup de fonctionnalités, je serais d'accord. Mais avec des boucles étroitement imbriquées, la longueur du code doit être de l'ordre de n + 1 ou 2n + 1, où n est le nombre de dimensions. Dans ce cas, des noms de variable plus longs peuvent réduire la lisibilité.
BillThor
11
+1 pour "In Fortran" parce que c'est ainsi que cette tradition a débuté - que vous aimiez ou non Fortran.
artem
34

Je crois que cela vient de la Summation :

Addition

Raphaël
la source
3
Intéressant! Ceci est antérieur à FORTRAN, mais dans le contexte de CS?
kprobst
3
Depuis que Backus a obtenu une maîtrise en mathématiques, cela semble logique.
dbasnett
9
La plupart des premiers génies de CS étaient soit en mathématiques, soit en génie électrique, ce qui nécessitait des calculs approfondis. Même aujourd'hui, votre "nerd informatique" moyen a généralement des compétences en mathématiques supérieures à la moyenne, car les mathématiques et les ordinateurs sont très logiques.
CorsiKa
8

Mon professeur de théorie de l'informatique, il y a quelques années, m'avait dit que l'origine était issue de la notation de sommation mathématique. i, j, k étaient couramment utilisés en tant que variables d'itération d'entiers, et ils ont été transférés à partir des premiers textes sur la théorie du calcul (qui, bien entendu, concerne principalement les mathématiques appliquées). Apparemment, en regardant le travail de Knuth et al. soutient ceci.

x, y, z en tant qu'itérateurs à virgule flottante sont apparemment apparus avec la popularité de Fortran dans les sciences physiques, des chercheurs en physique convertissant des intégrales en code source (puisque les intégrations étaient généralement par-dessus des limites spatiales ... alors que x passait à 100 et cetera)

Je n'ai pas de référence pour appuyer cela, mais comme je l'ai dit, cela vient d'un professeur assez âgé et semble avoir beaucoup de sens.

J'espère que cela t'aides

Stephen
la source
6

Je pense que i, j, k sont utilisés en mathématiques pour indiquer des indices dans des sommations et des éléments de matrice (i pour les lignes et j pour les colonnes). En notation mathématique, certaines lettres ont tendance à être utilisées avec une signification spécifique plus souvent que d’autres, par exemple a, b, c pour les constantes, f, g, h pour les fonctions, x, y, z pour les variables ou les coordonnées, i, j, k pour les indices. Au moins c'est ce que je me souviens des maths que j'ai prises à l'école.

Peut-être que cette notation a été transférée à l’informatique car au début, de nombreux informaticiens étaient mathématiciens ou avaient au moins de solides connaissances en mathématiques.

Giorgio
la source
3

i == itérateur ou index

Ma compréhension a toujours été que «i» est un bon choix, car les boucles servent généralement à itérer ou à parcourir avec une étape d'index connue. Les lettres "j" et "k" suivent bien, car les boucles imbriquées sont souvent nécessaires et la plupart des gens sauront instinctivement "j" == deuxième index et "k" == troisième index car ils suivent ce modèle dans l'alphabet. De plus, si beaucoup respectent cette convention standard, on peut supposer en toute sécurité qu'une boucle "k" sera probablement entourée d'une boucle "j" et d'une boucle "i".

jimp
la source
1

i, j, k sont utilisés dans le système de coordonnées cartésien. En comparant avec x et y, qui représentent des axises dans le même système et qui sont toujours utilisés comme variables, nous pouvons dire que i, j et k viennent aussi de là.

Sergey
la source
1

"i" est pour index.

Une seule lettre permet à votre œil de numériser plus facilement la ligne de code. Pour quelque chose d'aussi commun qu'une boucle, un seul caractère pour l'index est idéal. Il n'y a pas de confusion quant à ce que "i" signifie en raison de la convention.

jojo
la source
0

Quand j'ai commencé à programmer, Dartmouth BASIC était nouveau. Toutes les variables de cette langue et de quelques autres langues à l’époque étaient composées d’un seul caractère. Ajoutez à cela la convention de nommage des variables FORTRAN et le fait qu'il est beaucoup plus facile de taper un seul caractère et la compréhension des programmeurs et des enseignants plus anciens. Je ne sais pas, mais ça sonne bien.

Dave
la source