Dlaczego większość z nas używa „i” jako zmiennej licznika pętli?

126

Czy ktoś zastanawiał się, dlaczego tak wielu z nas powtarza ten sam wzorzec, używając tych samych nazw zmiennych?

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

Wydaje się, większość kodu, jaki kiedykolwiek spojrzał na zastosowań i, j, ki tak dalej jako zmienne iteracji.

Podejrzewam, że skądś to wziąłem, ale zastanawiam się, dlaczego jest to tak powszechne w rozwoju oprogramowania. Czy to coś, co wszyscy wybraliśmy z C czy coś takiego?

Po prostu swędzenie, które miałem przez jakiś czas z tyłu głowy.

kprobst
źródło
4
Zapytałem już dawno temu na SO; być może należy je tutaj zmigrować: stackoverflow.com/questions/454303/… i stackoverflow.com/questions/4137785/…
BlueRaja - Danny Pflughoeft
8
To zduplikowane pytanie i uwielbiam tę odpowiedź. Ze względu na nazwę D ijk stra.
Vivart
2
Zawsze myślałem, że i, j i k zostały zaczerpnięte z D ijk stra
Christian Kjær
1
BTW: Zawsze używam ii(i jj, kk...), dzięki czemu łatwiej jest zlokalizować podczas wyszukiwania.
Sabuncu
1
Czego jeszcze byś użył?
Thorbjørn Ravn Andersen

Odpowiedzi:

205

ii jzwykle były używane jako indeksy matematyczne od dłuższego czasu (np. nawet w dokumentach wcześniejszych niż języki wyższego poziomu, często widzisz takie rzeczy jak „X i, j ”, zwłaszcza w podsumowaniu).

Projektując Fortran, (najwyraźniej) zdecydowali się na to samo, więc wszystkie zmienne zaczynające się od „I” do „N” domyślnie są liczbami całkowitymi, a wszystkie inne - na liczbach rzeczywistych (zmiennoprzecinkowe). Dla tych, którzy go przeoczyli, jest to źródło starego żartu „Bóg jest prawdziwy (chyba, że ​​podano liczbę całkowitą)”.

Wydaje się, że większość ludzi nie widziała powodu, aby to zmienić. Jest powszechnie znany i rozumiany, i bardzo zwięzły. Od czasu do czasu widzisz coś napisanego przez jakiegoś psychotę, który uważa, że ​​istnieje prawdziwa zaleta czegoś takiego:

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;

Na szczęście jest to dość rzadkie, a większość przewodników po stylu wskazuje teraz, że chociaż długie, opisowe nazwy zmiennych mogą być przydatne, nie zawsze są one potrzebne, szczególnie w przypadku czegoś takiego, w którym zasięg zmiennej jest tylko wierszem lub dwoma kodami .

Jerry Coffin
źródło
13
+1 Nie myślałem o korelacji matematycznej tutaj. To była ciekawa realizacja.
Casey Patton
79
+1 za przypisanie psychozie tego, co niektórzy wyobrażają sobie jako styl.
Crashworks
2
OK - więc dlaczego i i j są używane jako indeksy matematyczne? Myślę, że to użycie jest wcześniejsze niż FORTRAN :-) Jestem pewien, że Knuth wie ...
Guy Sirton
34
@Guy 'i' jest dla indeksu, j jest kolejną literą po
Martin Beckett,
3
i i j są w porządku, a nawet preferowane w większości przypadków, jak wspomniał Jerry. Dużym problemem są pętle, które są tak duże, że nie można ich zobaczyć i zrozumieć na jednym ekranie. Te muszą zostać zrefaktoryzowane, aby były bardziej zwięzłe.
Craig
64

i - indeks.

Zmienna tymczasowa używana do iteracji pętli indeksowania. Jeśli masz już i, co jest bardziej naturalne niż dzieje się j, ki tak dalej?

W tym kontekście idxjest również często używany.

Krótki, prosty i pokazuje dokładnie, jakie jest użycie zmiennej, jak powinna być nazwa zmiennej.

littleadv
źródło
35
ijk = „Żartuję”. :-)
Mahmoud Hossam
2
czy możesz zacytować referencję?
Louis Rhys,
23
Możesz cytować mnie jako odniesienie, jeśli chcesz.
Captain Sensible
1
Może warto dodać, że często jest to dosłownie indeks (indeks dolny) w tablicy dostępnej w pętli. Nie zawsze, ale niezależnie od tego, czy postrzegasz go jako indeks interakcji, czy nie, nadal wygodnie jest uogólniać od wspólnej klasy pętli do szerszej klasy pętli. BTW - osobista dziwactwo - dla mnie „indeks” zwykle sugeruje coś w rodzaju „indeksu bazy danych”, w tym słowników kluczy / indeksów odwróconych w pamięci, dlatego wolę „indeks dolny” niż „indeks”, aby uniknąć dwuznaczności. Ale nadal używam ipętli.
Steve314,
3
W twoim myśleniu imoże również oznaczać iterator.
totymedli
39

W FORTRAN ibyła pierwszą literą domyślnie odpowiadającą typowi całkowitemu. Pełny zakres domyślnych typów liczb całkowitych zaczynał się od liter ido n. Praca z pętlami dla trzech wymiarach, ale nas i, ji k. Wzór kontynuowano dla dodatkowych wymiarów. Podobnie „x”, „y” i „z”, które domyślnie były zmiennoprzecinkowe, zostały użyte w przypadku zmiennych pętli wymagających liczb rzeczywistych.

Jak litleadvzauważa, ijest to również minimalny spadek indeksu.

Biorąc pod uwagę lokalne użycie tych zmiennych, nie widzę problemu z niestosowaniem bardziej opisowej nazwy.

BillThor
źródło
W przypadku pojedynczych pętli zgadzam się, ale w przypadku pętli zawierających pętle podoba mi się nieco więcej opisu.
Edward Strange
1
Ostatecznie odpowiedzią jest bezwładność . Zacząłem robić to z WATFOR (Waterloo FORTRAN) w 1973 roku i ... Nadal robię to w 2011 roku.
Peter Rowell,
1
@Crazy Eddie: Jeśli pętle zawierają wiele funkcji, zgodziłbym się. Jednak w przypadku ściśle zagnieżdżonych pętli długość kodu powinna być rzędu n + 1 lub 2n + 1, gdzie n jest liczbą wymiarów. W takim przypadku dłuższe nazwy zmiennych mogą zmniejszyć czytelność.
BillThor
11
+1 za „In Fortran”, bo tak właśnie zaczęła się ta tradycja - nie ma znaczenia, czy lubisz Fortran, czy nie.
artem
34

Wierzę, że pochodzi z podsumowania :

Podsumowanie

Raphael
źródło
3
Ciekawy! To poprzedza FORTRAN, ale w kontekście CS?
kprobst
3
Ponieważ Backus miał magistra matematyki, wydaje się to logiczne.
dbasnett,
9
Większość wczesnych geniuszy CS zajmowała się matematyką lub elektrotechniką, co wymagało obszernej matematyki. Nawet dzisiaj twój „komputerowy frajer” zwykle ma ponadprzeciętne umiejętności matematyczne, ponieważ matematyka i komputery są tak logicznie zorientowane.
corsiKa
8

Kilka lat temu powiedziano mi, na marginesie, mojej teorii profesora obliczeń, że pochodzenie pochodzi z matematycznej notacji sumującej. i, j, k były powszechnie używane jako zmienne iteracyjne liczb całkowitych i przeniesiono je z wczesnych tekstów na temat teorii obliczeń (która oczywiście jest przede wszystkim stosowana w matematyce). Najwyraźniej patrząc na prace Knutha i in. tworzy kopię zapasową.

x, y, z jako iteranty zmiennoprzecinkowe najwyraźniej pojawiły się wraz z popularnością Fortrana w naukach fizycznych, od fizyków badających konwersję całek na kod źródłowy (ponieważ integracje były zwykle ponad granicami przestrzennymi ... jak x idzie do 100 i tak dalej)

Nie mam odniesienia do tego, ale jak mówię, pochodzi od dość starego profesora i wydaje się mieć sens.

Mam nadzieję że to pomoże

Stephen
źródło
6

Myślę, że i, j, k są używane w matematyce do wskazywania wskaźników w sumach i dla elementów macierzy (i dla wierszy i j dla kolumn). W notacji matematycznej niektóre litery są częściej używane z określonym znaczeniem niż inne, np. A, b, c dla stałych, f, g, h dla funkcji, x, y, z dla zmiennych lub współrzędnych, i, j, k dla indeksów. Przynajmniej tak pamiętam z matematyki, którą wziąłem w szkole.

Być może zapis ten został przeniesiony do informatyki, ponieważ na początku wielu informatyków było matematykami lub przynajmniej miało silne zaplecze matematyczne.

Giorgio
źródło
3

i == iterator lub indeks

Moje rozumienie zawsze brzmiało „i” jest dobrym wyborem, ponieważ pętle są zazwyczaj przeznaczone do iteracji lub przechodzenia ze znanym krokiem indeksu. Litery „j” i „k” następują dobrze, ponieważ zagnieżdżone pętle są często potrzebne i większość z nich instynktownie zna „j” == drugi indeks i „k” == trzeci indeks, ponieważ są one zgodne z tym wzorem w alfabecie. Ponadto, ponieważ wielu przestrzega tej standardowej konwencji, można bezpiecznie założyć, że pętla „k” prawdopodobnie będzie zawierać pętle „j” i „i”.

jimp
źródło
1

i, j, k są używane w kartezjańskim układzie współrzędnych. Porównując z xiy, które reprezentują osie w tym samym systemie i które są zawsze używane jako zmienne, możemy powiedzieć, że stamtąd również pochodziły i, j i k.

Siergiej
źródło
1

„i” oznacza indeks.

Pojedyncza litera ułatwia skanowanie linii kodu. W przypadku czegoś tak powszechnego jak pętla idealny jest pojedynczy znak indeksu. Ze względu na konwencję nie ma wątpliwości co do tego, co oznacza „i”.

jojo
źródło
0

Kiedy zacząłem programować, Dartmouth BASIC był nowy. Wszystkie zmienne w tym i kilku innych językach były wówczas pojedynczymi znakami. Dodaj do tego konwencję nazewnictwa zmiennych FORTRAN i fakt, że o wiele łatwiej jest pisać, tylko jeden znak oraz zrozumienie ze strony starszych programistów i nauczycieli. Nie wiem, ale brzmi dobrze.

Dave
źródło