Чому для лічильників використовуються змінні "i" та "j"?


179

Я знаю, що це може здатися абсолютно нерозумним питанням, але я занадто цікавий, щоб не задавати ...

Чому "i" та "j" стали змінними, які використовувались як лічильники у більшості керуючих структур?

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

Це тому, що його насправді рекомендують для передового досвіду чи конвенції, чи є у нього якась незрозуміла причина?

На всякий випадок я знаю, що можу дати їм ім’я, яке я хочу, і що назви змінних не мають значення.


17
i = ітерація, а j = після
наміру

7
дивний 'с' не був обраний? як у реєстрі лічильників Intel cx.


16
Чому актуальні питання стають вікі-спільнотами лише тому, що вони популярні? Це дуже нагадує комунізм. Якщо хтось вигадує щось дійсно круте, уряд краде винахід, щоб поділитися з громадою.
orokusaki

9
Закритий неправильний шлях: відповіді тут є більш інформативними, ніж для інших qn ...
Чарльз Стюарт

Відповіді:


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використовується в математиці?
Слакс

13
@Slaks: Це гарне запитання. Я фактично думаю, що "я" може походити з цілого числа більше, ніж індекс. Я також думаю, що це легко написати на дошці. Ще в 70-х нас попередили, щоб бути впевненими, що ми написали свої «я» та «j» у абсолютно відмінній формі. Дійсно, нам сказали намалювати своє «я» точно так само, як і назад «j», щоб бути абсолютно зрозумілим.
S.Lott

26
@ S.Lott: Я сумніваюся, що це походить із цілого числа. Для цілих чисел ми використовуємо ℤ (чорна дошка Z) для цілих чисел, оскільки це означає німецьке слово Zahlen , що означає числа . Якщо припустити, що позначення підсумовування виникли приблизно в один і той же час, слід було б очікувати позначення на основі німецької мови, а німецьке слово для індексу - індекс , який також починається з i . І я не можу придумати багато листів, які особливо важко написати на дошці. Ну, крім ξ :-)
Antal Spector-Zabusky

14
"Ця конвенція існує тому, що ця конвенція існувала і раніше". Ось так працює етимологія: ніхто не знає, чому певний шум мав особливе значення в PIE. Непогано було б пояснити математичну умову, але питання полягає в тому, "чому вони використовуються як лічильники в контрольних структурах", тож поки хтось не дасть відповідь, що йде далі, це найкраще. Це хоча б міркує, чому його використовують у математиці. Належний історик з математики міг би дізнатися, можливо, використовуючи двійковий відбивач. Евклід не користувався ним, я вважаю, що зробив фон Нойман. Як щодо Коші? Він багато використовував індекси
Стів Джессоп

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

200

Я вважаю, що це сягає Фортран. Змінні, починаючи з I по Q, за замовчуванням були цілими, інші - справжніми. Це означало, що Iце перша ціла змінна, а Jдруга і т. Д., Тож вони стали використовуватись у циклі.


53
Я думаю, що це походить від того, як, схоже, математики люблять використовувати i, j, k як зручні підписки для підсумкових та матричних показників множення, а що ні. Я пам'ятаю, як читав у ранньому посібнику Fortran II щось про це. (Так, Фортран II.)
С.Лотт

5
Так, FORTRAN є джерелом цих умов.
Черга Jé

9
Мене вчили Iчерез Nне Q. Google, здається, здебільшого згоден. (різні версії FORTRAN?)
Х'ю Аллен

2
А все інше у Фортран за замовчуванням було справжнім. Що призводить до жарту "Бог справжній, якщо не оголошено ціле число".
Lagerbaer

4
@learnvst - тому що математики використовували i, j щонайменше століття раніше.
Мартін Бекетт

195

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


17
Для мене це, очевидно, найкраща відповідь. (Почесна згадка за відповідь Майкла Боргвардта, який також цитує математичну умовність, але не такий специфічний.) Вибачте, ваш не прийнятий. Все, що я можу зробити, - це дати свою нагороду.
Джон Y

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

Хе. Я час від часу поновлюю посилання на стару книгу google у цій відповіді, тому що Google продовжує рубати речі. Випадково зауважу, що документ 1816 року, який зараз пов'язаний, включає Чарльза Беббіджа (імовірно, він відрізняється популярністю двигуна / аналітичного двигуна) як автора. Тож, мабуть, це приклад першого використання цілочисленної змінної "i" комп'ютерним програмістом: ^)
timday

..OK посилання 1816 року не переходить на сторінку з "i", що використовується на ній, але вони є.
тайм

129

i = ціле число

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

EDIT : У мене немає проблем з відповіддю, що це походить з математики. Безперечно, саме тут дизайнери Fortran отримали натхнення. Справа в тому, що для мене все-таки, коли я почав програмувати у Fortran, ми використовували I, J, K, ... для лічильників циклів, оскільки вони були короткими, і перші юридично дозволені назви змінних для цілих чисел. Будучи другокурсником в ГС, я, мабуть, чув про Декарта (і дуже небагатьох інших), але дуже мало зв'язувався з математикою при програмуванні. Насправді перший курс, який я взяв, називався «Fortran for Business», і його викладав не математичний факультет, а факультет бізнесу / econ.

Принаймні, для мене називання змінних мало стосунок до математики, але все завдяки звичкам я взяв на себе написання коду Fortran, який я переніс на інші мови.


4
Я майже впевнений, що це FORTRAN.
Кейд Ру

4
Я, фортран ..... Це гниє розум. У нас є програміст, який використовує i ii і iii як імена змінних циклу. Інший симптом - 6 символьних назв змінних / функцій без голосних.
EvilTeach

4
@ tvan, я впевнений, що змінні, починаючи з I до N за замовчуванням до цілого числа, але ви все одно можете оголосити їх справжніми, отже жарт "Бог справжній, якщо не оголошено ціле число". +1 у будь-якому випадку, оскільки мій спогад від багатьох років тому, можливо, НЕ є ідеальним.
paxdiablo

10
Гей, хлопці FORTRAN дістали це математикам!
тайм

6
Я згоден з @timday. Використання i як індексу ряду є практикою математиків щонайменше 2 століття.
Scottie T

91

iозначає I ndex.
jприходить після i.


12
Я думаю, що він говорив про алфавіт, спробуйте використати трохи уяви :)
Джек

33
@Jack: Я думаю, @Pete жартував ;-)
Кріс Пфол

13
@Cpfohl: так, просто хотілося бути нудним: D
Джек

4
@ Pete Kirkham: Дякую, Піт, це був найкращий сміх, який я засміяв за останній місяць.
AMissico

@SLaks ... Я вважаю, що ваше право - це i = індекс, що походить від позначення індексу, який використовується в Math en.wikipedia.org/wiki/Index_notation або ось приємна посилання physics.ucsb.edu/~physCS31/fall2010/index- notation.pdf
Джон Харцок

63

Ці символи використовувались як матричні індекси в математиці задовго до винайдення електронних комп'ютерів.


52

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


Хороша відповідь. Це (мені) справді здається найбільш ймовірним поясненням.
Нолдорін

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

Я думаю про індекс щоразу, коли використовую i. Але спочатку я використовую його в основному тому, що весь код, який я дивлюся в іншому місці, використовує його, і це може бути успадковано від програмістів Fortran ...
страх

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.

alt текст

Ейлер вибрав i для уявної одиниці.

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

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

Нарешті, фізики почали використовувати групову теорію для опису симетрій у системах диференціальних рівнянь. Тож (ijk) почав означати "вектори, які переставляють місцями перестановкові групи", а потім рухаються до "індекс-подібних речей, які приймають усі можливі значення в певному наборі", що в основному означає те, що вони означають для циклу.


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
Я бачу n як number, як правило, кількість елементів у наборі.
Том Лейс

6
О, чоловіки, а що здається XXX? )) +1 для творчості;)
Ованн Григорян

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

21

Одного сонячного дня, Архімед замислювався ( як це було звичайно в сонячні дні ) і наткнувся на свого приятеля Ератостена.

Архімед сказав: "Вітаючи Архімеда до Ератостена! Я намагаюся знайти рішення про співвідношення декількох сферичних жорстких тіл у рівновазі. Я хотів би повторити ці тіла кілька разів, але я маю жахливий час відстежувати скільки ітерацій я зробив! "

Ератостен сказав: "Чому Архімед, ти дозріваєш сливи дітлаха, ти можеш просто позначити в піску послідовні ряди ліній, кожен слідкуючи за кількістю ітерацій, які ти зробив у процесі ітерації!"

Архімед закричав світові, що його великий друг, безперечно, є яскравим маяком інтелекту за те, що він придумав таке просте рішення. Але Архімед зауважив, що йому подобається ходити кругами навколо своєї піщаної ями, поки він розмірковує. Таким чином, був ризик втратити, який рядок знаходиться вгорі, а який - внизу.

"Можливо, я повинен позначити ці рядки буквою алфавіту, щойно відійшов убік, щоб я завжди знав, який рядок є! Що ви думаєте про це?" - запитав він, а потім додав: "Але Ератосфен ... які букви я буду використовувати?"

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

Ератосфен, нарешті втомившись від невпинного прохання двох листів, закричав: "Я просто не знаю !!!"

Тож Архімед вибрав перші два листи у вигуковій фразі Ератостена і подякував своєму другові за внесок.


Ці символи були швидко прийняті давньогрецькими розробниками Java, а решта - ну ... історія.


6
... і мав лист j.
Ендрю Грімм

Нічого собі, що майже читається як історія про черепаху та Ахілла з GEB Hofstadter's
ProfK

15

Я думаю, це тому, що багато циклів використовують змінну типу Int, щоб зробити підрахунок, як

for (int i = 0; etc

і коли ви набираєте, ви насправді вимовляєте це в голові (як, коли читаєте), тож у своїй думці ви говорите "int ...."

і коли вам слід скласти лист відразу після цього "int ....", ви говорите / введіть "я", тому що це перший лист, про який ви думаєте, коли ви тільки що сказали "int"

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

СЛОВО пишеться Вільям W, Добре О, Рубі R, Готово D

Отже, ви говорите Int I, Double d, Float f, string s тощо на основі першої літери.

І j використовується, тому що, коли ви зробили int I, J слідує за ним відразу.


7
iпередує цьому синтаксису.
СЛАкс

1
Це прекрасний спосіб сплутати лайно з дитиною; ти справді вчить своїх писати так ?!
Гонки легкості на орбіті

14

Я думаю, що це поєднання інших згаданих причин:

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

Поєднайте це з тим, що простір екрану в ті самі ранні дні був дуже обмеженим, як і пам'ять, мало сенс зберігати короткі імена змінних.


13

Можливо, історична?

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

наприклад:

зробіть 100 i = j, 100,5 .... 100 продовжуйте ....


FWIW, я зазвичай пропускаю букву l, тому що вона дуже схожа на число 1.
Носредна

13

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

Який би ви думаєте, що "я" означає це, все ще "відповідає рахунку".

Крім того, якщо у вас є лише один рядок коду в цьому циклі, ви, ймовірно, повинні називати змінну iterator / index / integer на щось більш значуще. Як: співробітникIndex

До речі, я зазвичай використовую "i" у своїх простих ітераторських петлях; якщо, звичайно, він містить кілька рядків коду.


13

i = йота, j = jot; обидва невеликі зміни.

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

Лічильник являє собою невелику зміну значення.

А з йоти походить jot (iot), що також є синонімом невеликої зміни.

пор. http://en.wikipedia.org/wiki/Iota


13

Ну з математики: (для латинських літер)

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: змінних


11

Думаю, багато головних причин:

  • математики використовують iі jдля « Природних чисел» у формулах (ті, які використовують « Складні числа» рідко, принаймні), тому це переноситься на програмування
  • від C , iпідказки до int. І якщо вам потрібен інший , intто i2це просто занадто довго, так що ви вирішили використовувати j.
  • Є мови, де перша літера визначає тип, а iпотім - an integer.


7

Це безумовно походить з математики, яка давно передувала комп'ютерному програмуванню.

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

Хтось повинен запитати історика математики.


6

Лічильники настільки поширені в програмах, і в перші дні обчислень все було на преміях ...
Програмісти, природно, намагалися зберегти пікселі, і 'я' вимагав менше пікселів, ніж будь-який інший лист, щоб представити. (Математики, ледачи, вибирали це з тієї ж причини - як найменший гліф).
Як було сказано раніше, "j" просто природно слідувало ...

:)


24
У перші дні обчислень пікселів не існувало .
СЛАкс

1
@Slaks, це один виграшний коментар. Просто бачиш посмішку на моєму обличчі, читаючи її, і голоси. Приємно!
ПрофК

"Програмісти, природно, намагалися зберегти пікселі, і" я "вимагав менше пікселів, ніж будь-яка інша літера. <<< що смішно.
окудо

1
... і таким чином народилася передчасна оптимізація!
Геррат

4

Я використовую її з ряду причин.

  • Зазвичай мої петлі базуються на int, тому ви робите повний трикутник на клавіатурі, набравши "int i", за винятком місця, яким я обробляю великий палець. Це дуже швидка послідовність набору.

  • "Я" може означати ітератор, ціле число, приріст або індекс, кожен з яких має логічний сенс.

З моїх особистих цілей, відхилених, теорія його походження від FORTRAN є правильною, де цілими числами використовуються літери I - N.


4

Я дізнався FORTRAN на Control Data Corp. 3100 в 1965 році. Змінні, що починаються з 'я' через 'N', мали означати цілі числа. Наприклад: 'IGGY' і 'NORB' були цілими числами, 'XMAX' і 'ALPHA' були плаваючою точкою. Однак ви можете змінити це через чітке оголошення.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.