Почему переменные «i» и «j» используются для счетчиков?


179

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

Почему «i» и «j» стали переменными для использования в качестве счетчиков в большинстве структур управления?

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

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

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


17
я = итерация, в то время как j = после
целого числа

7
странный "с" не был выбран? как в регистре счетчика Intel 'cx'.


16
Почему реальные вопросы становятся вики сообщества только потому, что они популярны? Это очень напоминает коммунизм. Если кто-то изобретает что-то действительно классное, правительство крадет это изобретение, чтобы поделиться им с сообществом.
orokusaki

9
Закрыто неправильно: ответы здесь более информативны, чем к другим вопросам ...
Чарльз Стюарт,

Ответы:


330

В конечном итоге это происходит из математики: в суммирующей записи традиционно используется i для первого индекса, j для второго и т. Д. Пример (из http://en.wikipedia.org/wiki/Summation ):

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

Он также используется таким образом для наборов вещей, например, если у вас есть набор переменных x 1 , x 2 , ... x n , тогда произвольная будет известна как x i .

Что касается того, почему это так, я думаю, что SLaks является правильным, и это потому, что я первая буква в Index.


93
@SLott: А почему iиспользуется в математике?
SLaks

13
@ Слакс: Это хороший вопрос. Я на самом деле думаю, что «я» может прийти от целого числа больше, чем индекс. Я также думаю, что это легко писать на доске. Еще в 70-х годах нас предупредили, чтобы мы были уверены, что написали наши «я» и «j» совершенно отличительным образом. В самом деле, нам было сказано нарисовать наше «я» в точности как «назад», чтобы быть совершенно ясным об этом.
S.Lott

26
@ S.Lott: я сомневаюсь, что это происходит от целого числа. Для целых чисел мы используем ℤ (полужирный шрифт Z), потому что оно обозначает немецкое слово Zahlen , что означает числа . Предполагая, что нотация суммирования возникла примерно в одно и то же время, можно ожидать немецкую нотацию - и немецкое слово для индекса - это индекс , который также начинается с i . И я не могу думать о многих письмах, которые особенно трудно написать на доске. Ну, кроме ξ :-)
Антал Спектор-Забуский

14
«Это соглашение существует, потому что это соглашение существовало раньше». Вот как работает этимология: никто не знает, почему конкретный шум имел особое значение в PIE. Было бы неплохо объяснить математическое соглашение, но вопрос заключается в том, «почему они используются в качестве счетчиков в управляющих структурах», поэтому, пока кто-то не даст ответ, который идет дальше, это будет лучшим. По крайней мере, он размышляет, почему он используется в математике. Правильный математический историк мог бы выяснить это, возможно, используя бинарную отбивную Евклид не использовал его, я уверен, что фон Нейман использовал. Как насчет Коши? Он много использовал индексы
Стив Джессоп

14
Я думаю, что именно Лагранж рекомендовал использовать a, b, c для констант функции и x, y, z для переменных функции. i, j, k обозначают «направления» вектора, а такие факторы формальной суммы можно рассматривать как степени свободы [направления, под другим именем] уравнения.
Дэвид

200

Я верю, что это восходит к Фортрану. Переменные, начинающиеся с I по Q, были по умолчанию целочисленными, остальные были действительными. Это означало, что это Iбыла первая целочисленная переменная, а Jтакже вторая и т. Д., Поэтому они стали использоваться в циклах.


53
Я думаю, что это происходит из-за того, что математики, похоже, предпочитают использовать i, j, k в качестве удобных подписок для индексов суммирования и умножения матриц, а что-нет. Я помню, что читал в раннем руководстве по Fortran II кое-что об этом. (Да, Фортран II.)
S.Lott

5
Да, FORTRAN создает эти соглашения.
Jé Queue

9
Меня учили Iчерез Nне Q. Google, кажется, в основном согласен. (разные версии Фортрана?)
Хью Аллен

2
А все остальное в Фортране было по умолчанию реально. Что приводит к шутке «Бог реален, если не объявлено целым числом».
Лагербаер

4
@learnvst - потому что математики использовали i, j как минимум сто лет назад.
Мартин Беккет

195

Математики использовали i, j, k для обозначения целых чисел в алгебре (индексы, серии, суммирования и т. Д.) Задолго до того, как появились компьютеры (например, 1836 или 1816 ) (это начало значений по умолчанию типа переменных FORTRAN). Привычка использовать буквы из конца алфавита (..., х, у, г) для неизвестных переменных и с самого начала (а, б, в ...) для констант , как правило , приписывается к Рене Декарта (см также здесь ), поэтому я предполагаю, что i, j, k ... n (в середине алфавита) для целых чисел, вероятно, тоже из-за него.


17
Для меня это явно лучший ответ. (Похвальное упоминание за ответ Майкла Боргвардта, который также цитирует математическое соглашение, но не настолько конкретное.) Мне жаль, что вы не приняты. Все, что я могу сделать, это отдать ему свой голос.
Джон Y

3
Это как раз та причина, по которой мы должны иметь возможность голосовать за принятый сообществом ответ (и да, я знаю, что это относится к пользовательскому счету).
Креднс

Хех. Я иногда обновляю ссылку на старую книгу Google в этом ответе, потому что Google продолжает разбирать вещи вокруг. Случайно, я отмечаю, что документ 1816 года, на который сейчас ссылаются, включает в себя автора Чарльза Бэббиджа (предположительно, он знаменитого аналитического механизма). Возможно, это пример первого использования целочисленной переменной «i» программистом: ^)
Timday

... Ладно, ссылка 1816 не переходит на страницу с надписью "i", но она есть.
timday

129

я = целое число

Приходит из Фортрана, где целочисленные переменные должны были начинаться с букв от I до N, а реальные переменные начинались с других букв. Таким образом, я был первым и самым коротким целочисленным именем переменной. Фортран был одним из первых широко распространенных языков программирования, и привычки, разработанные программистами, перенесли его на другие языки.

РЕДАКТИРОВАТЬ : У меня нет проблем с ответом, который он вытекает из математики. Несомненно, именно здесь дизайнеры Fortran черпали свое вдохновение. Во всяком случае, для меня это факт, когда я начал программировать на Фортране, мы использовали I, J, K, ... для счетчиков циклов, потому что они были короткими, а первые юридически допустимые имена переменных для целых чисел. Как второкурсник в HS, я, вероятно, слышал о Декарте (и очень немногих других), но при программировании очень мало имел отношения к математике. Фактически, первый курс, который я выбрал, назывался «Фортран для бизнеса» и преподавался не на математическом факультете, а на факультете бизнеса / экономики.

По крайней мере, для меня именование переменных не имело ничего общего с математикой, но все из-за привычек, которые я приобрел для написания кода на Фортране, который я перенес на другие языки.


4
Я почти уверен, что это был Фортран.
Cade Roux

4
Да, Фортран ..... Это гниет разум. У нас есть программист, который использует i ii и iii в качестве имен переменных цикла. Другой симптом - это 6-символьные имена переменных / функций без гласных.
EvilTeach

4
@tvan, я уверен, что переменные, начинающиеся с I по N, по умолчанию целочисленные, но вы все равно можете объявить их реальными, отсюда шутка: «Бог реален, если не объявлено целым числом» +1 в любом случае, поскольку мои воспоминания, сделанные много лет назад, возможно, НЕ идеальны.
paxdiablo

10
Эй, ребята из ФОРТРАНА получили это от математиков!
Timday

6
Я согласен с @timday. Использование i в качестве индекса ряда было практикой математиков в течение по крайней мере 2 столетий.
Скотти Т

91

iобозначает I ndex.
jприходит после i.


12
Я думаю, что он говорил об алфавите, попробуйте использовать воображение :)
Джек,

33
@Jack: я думаю, что @Pete пошутил ;-)
Крис Пфолл

13
@Cpfohl: да, просто хотел быть скучным: D
Джек,

4
@ Пит Киркхэм: Большое спасибо, Пит, это был лучший смех, который у меня был за последний месяц.
AMissico

@SLaks ... Я верю, что вы правы, что это так. I = Индекс, который исходит из нотации индекса, используемой в математике. En.wikipedia.org/wiki/Index_notation или вот хороший справочник по физике. notation.pdf
Джон Hartsock

63

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


52

Я думаю, что он, скорее всего, получен из индекса (в математическом смысле ) - он обычно используется в качестве индекса в суммах или других операциях на основе множеств и, скорее всего, использовался таким образом еще до появления языков программирования.


Хороший ответ. Это (для меня) действительно кажется наиболее вероятным объяснением.
Нолдорин

3
Ага. Математическая запись для суммы как и Y = Σ Xiпредшествует каждому языку программирования.
Треб

Я думаю об индексе каждый раз, когда использую i. Но изначально я использую его в основном потому , что весь код , я смотрю на других его использовать, и которые могут быть унаследованы от Фортрана программистов ...
благоговение

47

В математике предпочтение отдается использованию последовательных букв в алфавите для «анонимных» переменных, используемых аналогичным образом. Следовательно, не только «i, j, k», но также «f, g, h», «p, q, r», «x, y, z» (редко с префиксом «u, v, w»), и "α, β, γ".

Теперь «f, g, h» и «x, y, z» не используются свободно: первый предназначен для функций, а второй - для измерений. «p, q, r» также часто используются для функций.

Кроме того, существуют другие ограничения на доступные последовательности: «l» и «o» избегаются, поскольку во многих шрифтах они слишком похожи на «1» и «0». «t» часто используется для времени, «d & δ» для дифференциалов и «a, s, m, v» для физических мер ускорения, смещения, массы и скорости. Это оставляет не так много пробелов из трех последовательных букв без нежелательных ассоциаций в математике для индексов.

Затем, как заметили несколько других, условные обозначения из математики оказали сильное влияние на ранние условные обозначения в программировании, и «α, β, γ» не были доступны во многих ранних наборах символов.


2
Согласовано. Хотя a, b, cэто довольно часто используемая последовательность, несмотря на aто, что она имеет несколько значений ...
Stobor

32

Я нашел другой возможный ответ, который мог бы быть, что я, j и k происходят Hamilton's Quaternions.

альтернативный текст

Эйлер выбрал меня для воображаемой единицы.

Гамильтону понадобилось еще два квадратных корня из -1: ii = jj = kk = ijk = -1

Гамильтон был действительно влиятельным, и кватернионы были стандартным способом сделать 3D-анализ до 1900 года. К тому времени математики уже привыкли думать о (ijk) как о согласованном множестве. Векторное исчисление заменило кватернионный анализ в 1890-х годах, потому что это был лучший способ написать уравнения Максвелла. Но люди, как правило, записывали векторные величины следующим образом: (3i-2j+k) вместо (3,-2,1) . Так (ijk) стал стандартным базисным вектором в R ^ 3.

Наконец, физики начали использовать теорию групп для описания симметрий в системах дифференциальных уравнений. Итак, (ijk) начал обозначать «векторы, которые обмениваются группами перестановок», затем перешел к «индексным вещам, которые принимают все возможные значения в некотором заданном наборе», что в основном и означает в цикле for.


11
наконец другой подход к вопросу, интересный момент +1
Фабиан

30

отбрасывая (немного предвзято)

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

3
Я вижу как numberобычно число элементов в наборе.
Том Лейс

6
Ох, мужчины, а что, кажется, ХХХ? )) +1 за творчество;)
Ованес Григорян

Иногда я рад, что большую часть времени мне не нужно беспокоиться о том, с какими мнемониками другие люди приходят в голову за подобные вещи ...
Thies Heidecke

21

В один солнечный день Архимед обдумал ( как обычно было в солнечные дни ) и столкнулся со своим приятелем Эратосфеном.

Архимед сказал: «Приветствую Архимеда и Эратосфена! Я пытаюсь найти решение для соотношения нескольких сферических твердых тел в равновесии. Я хочу перебирать эти тела несколько раз, но у меня ужасное время, чтобы отследить сколько итераций я сделал!

Эратосфен сказал: «Почему, Архимед, ты, зрелая слива шутника, ты мог просто отметить последовательные ряды строк в песке, каждый из которых отслеживал количество итераций, которые ты сделал в итерации!»

Архимед закричал всему миру, что его великий друг, несомненно, был ярким маяком разума для того, чтобы придумать такое простое решение. Но Архимед заметил, что ему нравится ходить кругами вокруг своей песчаной ямы, пока он размышляет. Таким образом, был риск потерять след, какой ряд был сверху, а какой снизу.

«Возможно, мне следует пометить эти строки буквой алфавита рядом с тем, чтобы я всегда знал, какая строка какая! Что вы об этом думаете?» он спросил, затем добавил: «Но, Эратосфен ... какие буквы я буду использовать?»

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

Эратосфен, наконец усталый от непрекращающейся просьбы о двух письмах, закричал: «Я НЕ ЗНАЮ !!!»

Поэтому Архимед выбрал первые две буквы в восклицательном предложении Эратосфена и поблагодарил своего друга за вклад.


Эти символы были быстро приняты древнегреческими разработчиками Java, а остальное, ну ... история.


6
... и получил письмо j.
Эндрю Гримм

Ничего себе, это почти читается как история о Черепахе и Ахиллесе из GEB Хофштадтера
ProfK

15

я думаю, это потому, что многие циклы используют переменную типа Int для подсчета, например

for (int i = 0; etc

и когда вы печатаете, вы на самом деле произносите это в своей голове (например, когда вы читаете), поэтому в уме вы говорите «int ....»

и когда вам нужно написать письмо сразу после этого «int ....», вы говорите / набираете «i», потому что это первая буква, о которой вы думаете, когда только что сказали «int».

как вы пишете слово детям, которые начинают учиться читать слова, написанные для них, используя имена, например:

СЛОВО заклинания Уильям W, ОК O, Рубин R, Готово D

Итак, вы говорите Int I, Double d, Float f, string s и т. Д. На основе первой буквы.

И j используется, потому что, когда вы сделали int I, J следует сразу за ним.


7
iпредшествует этому синтаксису.
Слакс

1
Это отличный способ сбить с толку ребенка; ты действительно учишь свою заклинанию так ?!
Гонки легкости на орбите

14

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

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

Объедините это с тем фактом, что пространство экрана в те самые первые годы было очень ограничено, так же как и память, имело смысл сохранять более короткие имена переменных.


13

Возможно исторический?

FORTRAN, возможно, первый язык высокого уровня, определил i, j, k, l, m как целочисленные типы данных по умолчанию, и циклы могут управляться только целочисленной переменной, соглашение продолжается?

например:

сделать 100 я = J, 100,5 .... 100 продолжить ....


Я обычно пропускаю букву l, потому что она слишком похожа на цифру 1.
Nosredna

13

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

Что бы вы ни считали «я», оно все еще «отвечает всем требованиям».

Кроме того, если у вас нет только одной строки кода в этом цикле, вы, вероятно, должны называть переменную iterator / index / integer чем-то более значимым. Нравится: employeeIndex

Кстати, я обычно использую «i» в моих простых циклах итераторов; если, конечно, он не содержит несколько строк кода.


13

я = йота, j = йот; оба небольших изменения.

йота - самая маленькая буква в греческом алфавите; в английском языке его значение связано с небольшими изменениями, например, «ни на йоту» (из фразы в Новом Завете: «пока небо и земля не пройдут, ни йота, ни точка не перейдут от закона») (Мф 5:18)).

Счетчик представляет небольшое изменение значения.

И из йоты происходит йот (iot), который также является синонимом небольшого изменения.

ср http://en.wikipedia.org/wiki/Iota


13

Ну из математики: (для латинских букв)

a, b: используется в качестве констант или целых чисел для рационального числа
c: константа
d: производная
e: число Эйлера
f, g, h: функции
i, j, k: индексы (также единичные векторы и кватернионы)
l: как правило, не используется. выглядит как 1
m, n: строки и столбцы матриц или как целые числа для рациональных чисел
o: также не используется (если вы не помечены буквами o)
p, q: часто используется как простые числа
r: иногда пространственное изменение переменной другие времена, связанные с простыми числами
s, t: пространственные и временные переменные или s используется как замена переменной для t
u, v, w: изменение переменной
x, y, z: переменные


11

Я полагаю, много возможных основных причин:

  • математики используют iи jдля натуральных чисел в формулах (те, которые используют сложные числа редко, по крайней мере), так что это перенесено на программирование
  • от C , iнамекает на int. А если вам нужен другой, intто i2это слишком долго, поэтому вы решили использовать j.
  • Есть языки, в которых первая буква определяет тип, а iзатем - integer.


7

Это определенно происходит от математики, которая давно предшествовала компьютерному программированию.

Так откуда же взяться по математике? Мое совершенно необразованное предположение состоит в том, что, как сказал один из них, математики любят использовать буквенные кластеры для похожих вещей - f, g, h для функций; x, y, z для числовых переменных; p, q, r для логических переменных; u, v, w для других наборов переменных, особенно в исчислении; а, б, в для многих вещей. i, j, k пригодится для итерационных переменных, и это исчерпывает возможности. Почему не м, н? Ну, они используются для целых чисел, но чаще конечные точки итераций, а не сами итерационные переменные.

Кто-то должен спросить историка математики.


6

Счетчики так распространены в программах, и на заре компьютерных вычислений все было дороже ...
Программисты, естественно, старались сохранять пиксели, и для обозначения «i» требовалось меньше пикселей, чем для представления любой другой буквы. (Математики, будучи ленивыми, выбрали его по той же причине - как самый маленький глиф).
Как уже говорилось ранее, «j» естественно следовал ...

:)


24
В первые дни вычислений пиксели не существовали .
Слакс

1
@ Слакс, это один выигрышный комментарий. Просто посмотрите на улыбку на моем лице, читающем это, и голоса. Ницца!
ProfK

«Программисты, естественно, пытались сохранить пиксели, и« i »требовало меньше пикселей, чем любая другая буква». <<< это весело.
ocodo

1
... и, таким образом, преждевременная оптимизация родилась!
Геррат

4

Я использую это по ряду причин.

  • Обычно мои циклы основаны на int, поэтому вы делаете полный треугольник на клавиатуре, набирая «int i», за исключением места, которое я обрабатываю большим пальцем. Это очень быстрая последовательность ввода.

  • «I» может обозначать итератор, целое число, приращение или индекс, каждый из которых имеет логический смысл.

Если оставить в стороне мои личные использования, теория о том, что она получена из FORTRAN, верна, где целые числа используют буквы I - N.


4

Я изучил ФОРТРАН в корпорации Control Data 3100 в 1965 году. Предполагалось, что переменные, начинающиеся с 'I' до 'N', являются целыми числами. Пример: «IGGY» и «NORB» были целыми числами, «XMAX» и «ALPHA» были числами с плавающей точкой. Однако вы можете переопределить это через явное объявление.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.