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

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

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

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

Это потому, что на самом деле это рекомендуется для лучших практик или конвенций, или есть какая-то непонятная причина?

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

Это в конечном счете связано с математикой: нотация суммирования традиционно использует 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 правильный, и это потому, что я – первая буква в Индексе.

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

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

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

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

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

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

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

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

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

В математике предпочтение отдается использованию последовательных букв в алфавите для «анонимных» переменных, используемых аналогичным образом. Следовательно, не только «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» для физических мер ускорения, смещения, массы и скорости. Это оставляет не так много пробелов из трех последовательных букв без нежелательных ассоциаций в математике для индексов.

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

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

alt text

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

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

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

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

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

 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 

Один солнечный день, Архимед, размышлял ( как это было обычно для солнечных вечеров ) и врезался в своего приятеля Эратосфена.

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

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

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

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

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

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

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


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

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

 for (int i = 0; etc 

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

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

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

WORD гласит Уильям W, Ok O, Ruby R, Done D

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

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

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

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

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

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

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

например:

do 100 i = j, 100,5 …. 100 продолжают ….

i = iterator, i = индекс, i = целое число

Который когда-либо вы считаете, что «i» означает, что он все еще «соответствует счету».

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

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

i = iota, j = jot; оба небольшие изменения.

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

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

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

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

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

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

Я думаю, что многие возможные основные причины:

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

Он исходит от Fortran, где i, j, k, l, m, n являются неявными целыми числами.

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

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

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

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

🙂

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

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

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

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

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

  • Асинхронный и multithreading. Есть ли разница?
  • Должен ли я тестировать частные методы или только публичные?
  • Что вам не нравится в вашем любимом языке?
  • Когда бросать исключение?
  • Получение ближайшего соответствия строк
  • Понимание «случайности»
  • Является ли GUID уникальным в 100% случаев?
  • Полезно ли использовать «goto» на языке, который поддерживает циклы и функции? Если да, то почему?
  • Буферизованный и небуферизованный IO
  • Почему люди говорят, что при использовании генератора случайных чисел существует модульное смещение?
  • Структура данных, поддерживающая O (1) случайный доступ и наихудший вариант O (1)?
  • Interesting Posts

    Как добавить локальные файлы jar в проект Maven?

    SSH-туннель в домашнюю сеть и доступ к веб-интерфейсу маршрутизатора

    Коммуникация между fragmentом и активностью – лучшие практики

    Размер массива C, заданный переменной

    Autohotkey – установить горячую клавишу для переключения (отключено с помощью сценария автозапуска дыр)

    Как экспортировать сообщения из Outlook XP в текстовые файлы с каталогами для почтовых папок?

    Модель всегда не указана в XML POST

    Java – лучший способ печати 2D-массива?

    Как я могу удалить файлы Time Machine с помощью командной строки

    Repeater, ListView, DataList, DataGrid, GridView … Что выбрать?

    Android – как получать трансляции намерения ACTION_SCREEN_ON / OFF?

    Facebook Graph Api – Проводка на страницу поклонников в качестве администратора

    Обнаружение взаимоблокировки в Java

    Могу ли я установить Windows 7 x64 на MacBook Air?

    Ошибка загрузки Windows: C: \ Windows \ system32 \ config \ system Код ошибки: 0xc0000185

    Давайте будем гением компьютера.