¿Por qué la mayoría de nosotros usamos 'i' como una variable de contador de bucle?

126

¿Alguien ha pensado por qué tantos de nosotros repetimos este mismo patrón usando los mismos nombres de variables?

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

Parece que la mayoría de código que he mirado usos i, j, ky así sucesivamente como variables de iteración.

Supongo que lo aprendí de alguna parte, pero me pregunto por qué esto es tan frecuente en el desarrollo de software. ¿Es algo que todos aprendimos de C o algo así?

Solo un picor que he tenido por un tiempo en la parte posterior de mi cabeza.

kprobst
fuente
44
Ya pregunté hace mucho tiempo en SO; tal vez deberían migrarse aquí: stackoverflow.com/questions/454303/… y stackoverflow.com/questions/4137785/…
BlueRaja - Danny Pflughoeft
8
Es una pregunta duplicada y me encanta esta respuesta. Por el nombre de D ijk stra.
Vivart
2
Siempre pensé que i, j y k fueron tomados de D ijk stra
Christian Kjær
1
Por cierto: siempre uso ii(y jj, kk...) para que sea más fácil de localizar cuando busco.
Sabuncu
1
¿Qué más usarías?
Thorbjørn Ravn Andersen

Respuestas:

205

iy jgeneralmente se han utilizado como subíndices en bastante matemática durante bastante tiempo (por ejemplo, incluso en documentos que son anteriores a los idiomas de nivel superior, con frecuencia se ven cosas como "X i, j ", especialmente en cosas como una sumatoria).

Cuando diseñaron Fortran, (aparentemente) decidieron permitir lo mismo, por lo que todas las variables que comienzan con "I" hasta "N" son por defecto enteras y todas las demás a real (punto flotante). Para aquellos que se lo perdieron, esta es la fuente de la vieja broma "Dios es real (a menos que se declare entero)".

La mayoría de las personas parecen haber visto pocas razones para cambiar eso. Es ampliamente conocido y entendido, y bastante sucinto. De vez en cuando ves algo escrito por un psicótico que cree que hay una ventaja real en algo como:

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;

Afortunadamente, esto es bastante raro, y la mayoría de las guías de estilo ahora señalan que si bien los nombres largos y descriptivos de variables pueden ser útiles, no siempre los necesita, especialmente para algo como esto, donde el alcance de la variable es solo una línea o dos de código .

Jerry Coffin
fuente
13
+1 No había pensado en la correlación matemática aquí. Esta fue una realización interesante.
Casey Patton
79
+1 por atribuir a la psicosis lo que algunos imaginan que es estilo.
Crashworks
2
OK, entonces, ¿por qué se usan iyj como subíndices en matemáticas? Creo que este uso es anterior a FORTRAN :-) Estoy seguro de que Knuth lo sabe ...
Guy Sirton
34
@Guy 'i' es para index, j es la siguiente letra después de i
Martin Beckett
3
iyj están bien o incluso preferibles en la mayoría de los casos, como Jerry aludió. Un problema mayor son los bucles que son tan grandes que no se pueden ver y comprender todo en una sola pantalla. Esos deben ser refactorizados para que sean más concisos.
Craig
63

i - índice.

Una variable temporal que se utiliza para indexar la iteración del bucle. Si ya tienes una i, lo que es más natural que va a j, ky así sucesivamente?

En ese contexto a idxmenudo se usa también.

Corto, simple y muestra exactamente cuál es el uso de la variable, como debería ser el nombre de la variable.

littleadv
fuente
35
ijk = "Solo estoy bromeando". :-)
Mahmoud Hossam
2
puedes citar una referencia?
Louis Rhys
23
Puedes citarme como referencia si quieres.
Capitán Sensible
1
Quizás valga la pena agregar que a menudo es literalmente un índice (subíndice) en una matriz a la que se accede en el bucle. No siempre, pero si lo ve como un índice de las interacciones o no, sigue siendo conveniente generalizar desde una clase de bucle común a una clase de bucle más amplia. Por cierto, lo extraño personal: para mí, "índice" tiende a implicar algo como "índice de base de datos", incluidos diccionarios de clave a subíndice / tablas invertidas en la memoria, por lo que prefiero "subíndice" en lugar de "índice" para evitar la ambigüedad. Pero todavía lo uso ipara bucles.
Steve314
3
En su línea de pensamiento también ipodría significar iterador.
totymedli
39

En FORTRAN ifue la primera letra predeterminada para el tipo entero. La gama completa de tipos enteros implícitos comenzaba con las letras ia n. Trabajar con bucles de tres dimensiones nos metió i, jy k. El patrón continuó para dimensiones adicionales. Del mismo modo, 'x', 'y' y 'z', que por defecto eran de coma flotante, se usaban para variables de bucle que requerían números reales.

Como litleadvnotas, itambién es una contracción mínima para el índice.

Dado el uso local de estas variables, no veo un problema al no usar un nombre más descriptivo.

BillThor
fuente
Para los bucles individuales, estoy de acuerdo, pero para los bucles que contienen bucles me gusta un poco más de descripción.
Edward Strange
1
En definitiva, la respuesta es la inercia . Comencé a hacerlo con WATFOR (Waterloo FORTRAN) en 1973 y ... todavía lo hago en 2011.
Peter Rowell
1
@Crazy Eddie: si los bucles contienen mucha funcionalidad, estaría de acuerdo. Pero con bucles estrechamente anidados, la longitud del código debe ser del orden de n + 1 o 2n + 1 donde n es el número de dimensiones. En ese caso, los nombres de variables más largos pueden disminuir la legibilidad.
BillThor
11
+1 para "In Fortran" porque así es como comenzó la tradición: no importa si te gusta Fortran o no.
artem
34

Creo que proviene del resumen :

Suma

Rafael
fuente
3
¡Interesante! Esto es anterior a FORTRAN, pero en el contexto de CS?
kprobst
3
Dado que Backus tenía una maestría en matemáticas, parece lógico.
dbasnett
99
La mayoría de los genios de CS tempranos estaban en matemáticas o ingeniería eléctrica, lo que requería una gran cantidad de matemáticas. Incluso hoy en día, su "nerd informático" promedio generalmente tiene habilidades matemáticas por encima del promedio, porque las matemáticas y las computadoras están muy orientadas lógicamente.
corsiKa
8

Hace un par de años, mi profesor de teoría de la computación me dijo que el origen era de la notación de suma matemática. i, j, k se usaban comúnmente como variables de iteración de enteros, y se transfirieron desde los primeros textos sobre la teoría de la computación (que, por supuesto, es principalmente matemática aplicada). Aparentemente mirando el trabajo de Knuth et al. respalda esto.

x, y, z como iterantes de coma flotante aparentemente llegaron con la popularidad de Fortran en las ciencias físicas, de investigadores de física que convirtieron integrales en código fuente (ya que las integraciones eran comúnmente más allá de los límites espaciales ... a medida que x llega a 100, etc.)

No tengo una referencia para respaldar esto, pero como digo, vino de un profesor bastante viejo y parece tener mucho sentido.

Espero que esto ayude

Stephen
fuente
6

Creo que i, j, k se usan en matemáticas para indicar índices en sumaciones y para elementos matriciales (i para las filas yj para las columnas). En notación matemática, algunas letras tienden a usarse con un significado específico con más frecuencia que otras, por ejemplo, a, b, c para constantes, f, g, h para funciones, x, y, z para variables o coordenadas, i, j, k para índices. Al menos esto es lo que recuerdo de las matemáticas que tomé en la escuela.

Quizás esta notación se haya transferido a la informática porque al principio muchos informáticos eran matemáticos o al menos tenían una sólida formación matemática.

Giorgio
fuente
3

i == iterador o índice

Mi comprensión siempre ha sido 'i' es una buena opción ya que los bucles son generalmente para iterar o atravesar con un paso de índice conocido. Las letras 'j' y 'k' siguen bien, ya que a menudo se necesitan bucles anidados y la mayoría sabrá instintivamente 'j' == segundo índice y 'k' == tercer índice ya que siguen ese patrón en el alfabeto. Además, con muchos siguiendo esta convención estándar, uno puede asumir con seguridad que un bucle 'k' probablemente tendrá un bucle 'j' e 'i' envolviéndolo.

pobre
fuente
1

i, j, k se usan en el sistema de coordenadas cartesianas. Comparando con x e y que representan ejes en el mismo sistema y que siempre se usan como variables, podemos decir que i, j y k también provienen de allí.

Sergey
fuente
1

"i" es para el índice.

Una sola letra hace que sea más fácil para sus ojos escanear la línea de código. Para algo tan común como el bucle, un único carácter para el índice es ideal. No hay confusión en cuanto a lo que significa "i" debido a la convención.

jojo
fuente
0

Cuando comencé a programar, Dartmouth BASIC era nuevo. Todas las variables en este y otros idiomas en ese momento eran caracteres individuales. Agregue a eso la convención de nomenclatura variable FORTRAN y el hecho de que es mucho más fácil escribir, solo un carácter, y la comprensión de los programadores y maestros más antiguos. No lo sé, pero suena bien.

Dave
fuente