Почему большинство из нас использует 'i' в качестве переменной счетчика цикла?

126

Кто-нибудь задумывался над тем, почему многие из нас повторяют один и тот же шаблон, используя одни и те же имена переменных?

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

Кажется , больше всего кода я когда - либо смотрел на использований i, j, kи так далее , как итерационных переменных.

Я полагаю, что откуда-то взял это, но мне интересно, почему это так распространено в разработке программного обеспечения. Это что-то, что мы все взяли из C или что-то в этом роде?

Просто зуд у меня какое-то время в затылке.

kprobst
источник
4
Уже давно спрашивал о SOON; возможно, их следует перенести сюда: stackoverflow.com/questions/454303/… и stackoverflow.com/questions/4137785/…
BlueRaja - Дэнни Пфлугхофт
8
Это дублирующий вопрос, и я люблю этот ответ. Из-за названия D ijk stra .
Виварт
2
Я всегда думал , что я, J и К был взят из из D IJK Стр
Christian Kjær
1
BTW: Я всегда использую iijj, kk...) , так что легче найти при поиске.
Сабунку
1
Что еще вы бы использовали?
Торбьерн Равн Андерсен

Ответы:

205

iи j, как правило, довольно долго использовались в качестве подписчиков в математике (например, даже в статьях, предшествующих языкам более высокого уровня, вы часто видите такие вещи, как «X i, j », особенно в таких вещах, как суммирование).

Когда они разработали Fortran, они (по-видимому) решили разрешить то же самое, поэтому все переменные, начинающиеся с «I» до «N», по умолчанию имеют целочисленные значения, а все остальные - вещественные (с плавающей запятой). Для тех, кто пропустил это, это источник старой шутки «Бог реален (если не объявлено целое число)».

Кажется, что большинство людей не видят оснований изменить это. Это широко известно и понятно, и довольно кратко. Время от времени вы видите что-то написанное психотиком, который думает, что есть реальное преимущество для чего-то вроде:

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;

К счастью, это довольно редко, и большинство руководств по стилю теперь указывают, что хотя длинные описательные имена переменных могут быть полезны, они вам не всегда нужны, особенно для чего-то подобного, где область действия переменной - всего одна или две строки кода. ,

Jerry Coffin
источник
13
+1 Я не думал о математической корреляции здесь. Это была интересная реализация.
Кейси Паттон
79
+1 за приписывание психозу того, что некоторые считают стилем.
Crashworks
2
Хорошо - так почему я и j используются в качестве индексов в математике? Я думаю, что это использование предшествует Фортрану :-) Я уверен, что Кнут знает ...
Гай Сиртон
34
@ Гай 'я' для индекса, j следующая буква после я
Мартин Беккет
3
Я и J в порядке или даже предпочтительнее в большинстве случаев, как намекал Джерри. Еще большая проблема - петли, которые настолько велики, что вы не можете увидеть и понять все это на одном экране. Те должны быть реорганизованы, чтобы они были более краткими.
Крейг
63

i - индекс.

Временная переменная, используемая для индексации итерации цикла. Если у вас уже есть i, что более естественно , чем ходить j, kи так далее?

В этом контексте idxчасто используется также.

Коротко, просто и точно показывает, как используется переменная, как и должно быть имя переменной.

littleadv
источник
35
ijk = "Я просто шучу". :-)
Махмуд Хоссам
2
Можете ли вы привести ссылку?
Луи Рис
23
Вы можете ссылаться на меня, если хотите.
Капитан Разумный
1
Возможно, стоит добавить, что это часто буквально индекс (индекс) в массиве, к которому осуществляется доступ в цикле. Не всегда, но независимо от того, рассматриваете ли вы его как указатель на целые числа или нет, все же удобно обобщать из общего класса цикла в более широкий класс цикла. Кстати, личная причудливость - мне кажется, что «индекс» подразумевает что-то вроде «индекса базы данных», включая словари от ключа к индексу / инвертированные таблицы в памяти, поэтому я предпочитаю «индекс», а не «индекс», чтобы избежать неоднозначности. Но я все еще использую iдля петель.
Steve314
3
В вашем ходу мыслей iможет означать итератор.
totymedli
39

В Фортране iбыла первая буква по умолчанию для целочисленного типа. Полный диапазон неявных целочисленных типов были любые начинающимся с буквами iв n. Работа с петлями для трех измерений у нас i, jи k. Картина продолжалась для дополнительных измерений. Аналогично, «x», «y» и «z», которые по умолчанию считаются числами с плавающей запятой и используются для переменных цикла, для которых требуются действительные числа.

Как litleadvотмечается, iэто также минимальное сокращение индекса.

Учитывая локальное использование этих переменных, я не вижу проблемы, не используя более описательное имя.

BillThor
источник
Для отдельных циклов я согласен, но для циклов, содержащих циклы, мне нравится немного больше описания.
Эдвард Стрендж,
1
В конечном итоге ответ - инерция . Я начал делать это с WATFOR (Ватерлоо Фортран) в 1973 году и ... Я все еще делаю это в 2011 году.
Питер Роуэлл
1
@Crazy Eddie: Если циклы содержат много функций, я бы согласился. Но с плотно вложенными циклами длина кода должна быть порядка n + 1 или 2n + 1, где n - количество измерений. В этом случае более длинные имена переменных могут снизить читабельность.
BillThor
11
+1 за "In Fortran", потому что именно так началась эта традиция - не имеет значения, нравится ли вам Fortran или нет.
Артем
34

Я полагаю, что это происходит от Суммирование :

суммирование

Рафаэль
источник
3
Интересно! Это предшествует Фортрану, но в контексте КС?
kprobst
3
Поскольку Бэкус имел степень магистра по математике, это кажется логичным.
dbasnett
9
Большинство ранних гениев CS были либо в математике, либо в электротехнике, что требовало обширной математики. Даже сегодня ваш средний «компьютерный ботаник» обычно имеет математические навыки выше среднего, потому что математика и компьютеры так логически ориентированы.
CorsiKa
8

Пару лет назад, в дополнение к моему профессору теории вычислений, мне сказали, что источником является математическая суммация. i, j, k обычно использовались как целочисленные итерационные переменные, и они перенесены из ранних текстов по теории вычислений (что, конечно, в первую очередь является прикладной математикой). Видимо, глядя на работу Кнута и соавт. поддерживает это.

x, y, z как итераторы с плавающей точкой, очевидно, пришли с популярностью Fortran в физических науках, из-за того, что физики-исследователи конвертировали интегралы в исходный код (так как интеграции были обычно в пространственных границах ... как x идет до 100 и так далее)

У меня нет упоминания, подтверждающего это, но, как я уже сказал, оно пришло от довольно старого профессора и, похоже, имеет большой смысл.

Надеюсь это поможет

Стивен
источник
6

Я думаю, что i, j, k используются в математике для указания индексов в суммах и для матричных элементов (i для строк и j для столбцов). В математической записи некоторые буквы, как правило, используются с определенным значением чаще, чем другие, например, a, b, c для констант, f, g, h для функций, x, y, z для переменных или координат, i, j, K для индексов. По крайней мере, это то, что я помню из математики, которую я взял в школе.

Возможно, это обозначение было перенесено в вычислительную технику, потому что вначале многие компьютерные ученые были математиками или, по крайней мере, имели сильный математический опыт.

Джорджио
источник
3

я == итератор или индекс

Я всегда понимал, что «я» - хороший выбор, поскольку циклы обычно предназначены для итерации или обхода с известным шагом индекса. Буквы «j» и «k» хорошо следуют, поскольку часто нужны вложенные циклы, и большинство из них инстинктивно будут знать «j» == второй индекс и «k» == третий индекс, поскольку они следуют этому шаблону в алфавите. Кроме того, поскольку многие придерживаются этого стандартного соглашения, можно с уверенностью предположить, что цикл 'k', скорее всего, будет иметь циклы 'j' и 'i', обертывающие его.

скудный
источник
1

i, j, k используются в декартовой системе координат. Сравнивая x и y, которые представляют оси в одной и той же системе и которые всегда используются в качестве переменных, мы можем сказать, что i, j и k также пришли оттуда.

Сергей
источник
1

«я» для индекса.

Одна буква позволяет вашему глазу сканировать строку кода. Для чего-то общего, такого как цикл, идеальным является отдельный символ индекса. Нет никакой путаницы относительно того, что означает «я» в связи с соглашением.

Jojo
источник
0

Когда я начал программировать, Dartmouth BASIC был новым. Все переменные в этом и некоторых других языках в то время были отдельными символами. Добавьте к этому соглашение о присвоении имен в FORTRAN и тот факт, что его гораздо проще печатать, только один символ, и понимание от старых программистов и учителей. Я не знаю, но это звучит хорошо.

Дейв
источник