Mengapa kebanyakan dari kita menggunakan 'i' sebagai variabel penghitung lingkaran?

126

Adakah yang berpikir mengapa banyak dari kita mengulang pola yang sama ini menggunakan nama variabel yang sama?

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

Tampaknya kode paling aku pernah melihat kegunaan i, j, kdan sebagainya sebagai variabel iterasi.

Saya kira saya mengambilnya dari suatu tempat, tapi saya heran mengapa ini begitu lazim dalam pengembangan perangkat lunak. Apakah itu sesuatu yang kita semua ambil dari C atau sesuatu seperti itu?

Gatal-gatal saja untuk sementara waktu di belakang kepalaku.

kprobst
sumber
4
Sudah meminta waktu looong lalu pada SO; mungkin yang harus dimigrasikan di sini: stackoverflow.com/questions/454303/… dan stackoverflow.com/questions/4137785/…
BlueRaja - Danny Pflughoeft
8
Ini pertanyaan ganda dan saya suka jawaban ini. Karena nama D ijk stra.
Vivart
2
Saya selalu berpikir bahwa saya, j dan k diambil dari D ijk stra
Christian Kjær
1
BTW: Saya selalu menggunakan ii(dan jj, kk, ...) sehingga lebih mudah untuk menemukan ketika mencari.
Sabuncu
1
Apa lagi yang akan Anda gunakan?
Thorbjørn Ravn Andersen

Jawaban:

205

idan jbiasanya telah digunakan sebagai subskrip dalam sedikit matematika untuk beberapa waktu (misalnya, bahkan dalam makalah yang mendahului bahasa tingkat yang lebih tinggi, Anda sering melihat hal-hal seperti "X i, j ", terutama dalam hal-hal seperti penjumlahan).

Ketika mereka merancang Fortran, mereka (tampaknya) memutuskan untuk mengizinkan hal yang sama, jadi semua variabel dimulai dengan "I" hingga "N" default ke integer, dan semua yang lain menjadi nyata (floating point). Bagi mereka yang telah melewatkannya, ini adalah sumber dari lelucon lama "Tuhan itu nyata (kecuali dinyatakan bilangan bulat)".

Sebagian besar orang tampaknya hanya melihat sedikit alasan untuk mengubahnya. Ini dikenal luas dan dipahami, dan cukup ringkas. Sesekali Anda melihat sesuatu yang ditulis oleh beberapa psikotik yang berpikir ada keuntungan nyata untuk sesuatu seperti:

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;

Untungnya ini cukup langka, dan sebagian besar panduan gaya sekarang menunjukkan bahwa sementara panjang, nama variabel deskriptif dapat berguna, Anda tidak selalu membutuhkannya, terutama untuk sesuatu seperti ini di mana ruang lingkup variabel hanya satu atau dua baris kode .

Jerry Coffin
sumber
13
+1 Saya belum memikirkan korelasi matematika di sini. Ini adalah realisasi yang menarik.
Casey Patton
79
1 untuk dikaitkan dengan psikosis apa yang dibayangkan sebagian orang sebagai gaya.
Crashworks
2
OK - jadi mengapa saya dan j digunakan sebagai subskrip matematika? Saya pikir penggunaan ini sebelum FORTRAN :-) Saya yakin Knuth tahu ...
Guy Sirton
34
@Beli 'i' adalah untuk indeks, j adalah huruf berikutnya setelah saya
Martin Beckett
3
i dan j baik-baik saja atau bahkan lebih disukai dalam banyak kasus, seperti yang disinggung Jerry. Masalah yang lebih besar adalah loop yang begitu besar sehingga Anda tidak bisa melihat dan memahami semuanya pada satu layar. Itu perlu di refactored agar lebih ringkas.
Craig
63

i - indeks.

Variabel sementara yang digunakan untuk pengulangan loop pengindeksan. Jika Anda sudah memiliki i, apa yang lebih alami daripada pergi ke j, kdan sebagainya?

Dalam konteks idxitu sering digunakan juga.

Pendek, sederhana, dan menunjukkan dengan tepat apa penggunaan variabel, sebagaimana nama variabel seharusnya.

littleadv
sumber
35
ijk = "Aku hanya bercanda". :-)
Mahmoud Hossam
2
dapatkah Anda mengutip referensi?
Louis Rhys
23
Anda dapat mengutip saya sebagai referensi jika Anda mau.
Kapten Sensible
1
Mungkin patut ditambahkan bahwa itu seringkali secara harfiah berupa indeks (subskrip) ke dalam array yang diakses dalam loop. Tidak selalu, tetapi apakah Anda melihatnya sebagai indeks ke dalam interaksi atau tidak, masih nyaman untuk menggeneralisasi dari kelas umum loop ke kelas loop yang lebih luas. BTW - keanehan pribadi - bagi saya "indeks" cenderung menyiratkan sesuatu seperti "indeks basis data", termasuk kamus key-to-subscript / tabel terbalik dalam memori, jadi saya lebih suka "subskrip" daripada "indeks" untuk menghindari ambiguitas. Tapi saya masih menggunakan iloop.
Steve314
3
Dalam kereta pikiran Anda ibisa berarti iterator juga.
totymedli
39

Dalam FORTRAN iadalah huruf pertama ke default ke tipe integer. Berbagai jenis bilangan bulat implisit yang setiap dimulai dengan huruf iuntuk n. Bekerja dengan loop selama tiga dimensi membuat kami i, jdan k. Pola berlanjut untuk dimensi tambahan. Demikian juga, 'x', 'y', dan 'z' yang default sebagai titik mengambang di mana digunakan untuk variabel loop yang membutuhkan bilangan real.

Sebagai litleadvcatatan, ijuga merupakan kontraksi minimal untuk indeks.

Mengingat penggunaan lokal dari variabel-variabel ini, saya tidak melihat masalah tidak menggunakan nama yang lebih deskriptif.

BillThor
sumber
Untuk loop tunggal saya setuju, tetapi untuk loop yang berisi loop saya suka sedikit deskripsi lebih lanjut.
Edward Strange
1
Pada akhirnya jawabannya adalah inersia . Saya mulai melakukannya dengan WATFOR (Waterloo FORTRAN) pada tahun 1973 dan ... Saya masih melakukannya pada tahun 2011.
Peter Rowell
1
@Crazy Eddie: Jika loop berisi banyak fungsi, saya setuju. Tetapi dengan loop bersarang ketat, panjang kode harus di urutan n + 1 atau 2n + 1 di mana n adalah jumlah dimensi. Dalam hal ini nama variabel yang lebih panjang dapat mengurangi keterbacaan.
BillThor
11
+1 untuk "In Fortran" karena begitulah tradisi itu telah dimulai - tidak masalah apakah Anda suka Fortran atau tidak.
artem
34

Saya percaya itu berasal dari Penjumlahan :

Penjumlahan

Raphael
sumber
3
Menarik! Ini mendahului FORTRAN, tetapi dalam konteks CS?
kprobst
3
Karena Backus memiliki gelar Master di bidang matematika, tampaknya logis.
dbasnett
9
Kebanyakan jenius CS awal adalah ke dalam matematika atau teknik listrik, yang membutuhkan matematika yang luas. Bahkan hari ini, "komputer nerd" rata-rata Anda biasanya memiliki keterampilan matematika di atas rata-rata, karena matematika dan komputer sangat berorientasi secara logis.
corsiKa
8

Saya diberitahu, di samping oleh teori komputasi profesor saya beberapa tahun yang lalu, bahwa asalnya adalah dari penjumlahan penjumlahan matematika. i, j, k umumnya digunakan sebagai variabel iterasi integer, dan ditransfer dari teks awal tentang teori perhitungan (yang tentu saja terutama diterapkan matematika). Rupanya melihat karya Knuth et al. mendukung ini.

x, y, z sebagai floating point iterants tampaknya datang dengan popularitas Fortran dalam ilmu fisika, dari para peneliti fisika mengubah integral menjadi kode sumber (karena integrasi biasanya lebih dari batas spasial ... seperti x pergi ke 100 et cetera)

Saya tidak memiliki referensi untuk mendukung ini, tetapi seperti yang saya katakan, itu berasal dari seorang profesor yang cukup tua dan tampaknya masuk akal.

Semoga ini membantu

Stephen
sumber
6

Saya pikir i, j, k digunakan dalam Matematika untuk menunjukkan indeks dalam penjumlahan dan untuk elemen matriks (i untuk baris dan j untuk kolom). Dalam notasi matematika, beberapa huruf cenderung digunakan dengan makna spesifik lebih sering daripada yang lain, misalnya a, b, c untuk konstanta, f, g, h untuk fungsi, x, y, z untuk variabel atau koordinat, i, j, k untuk indeks. Setidaknya ini yang saya ingat dari Matematika yang saya ambil di sekolah.

Mungkin notasi ini telah dipindahkan ke komputasi karena pada awalnya banyak ilmuwan komputer adalah ahli matematika atau setidaknya memiliki latar belakang matematika yang kuat.

Giorgio
sumber
3

i == iterator atau indeks

Pemahaman saya selalu 'i' adalah pilihan yang baik karena loop biasanya untuk iterasi atau melintasi dengan langkah indeks yang dikenal. Huruf 'j' dan 'k' mengikuti dengan baik karena loop bersarang sering diperlukan dan sebagian besar akan secara naluriah mengetahui 'j' == indeks kedua dan 'k' == indeks ketiga karena mereka mengikuti pola itu dalam alfabet. Selain itu, dengan banyak orang mengikuti konvensi standar ini, orang dapat dengan aman menganggap loop 'k' kemungkinan akan memiliki loop 'j' dan 'i' yang membungkusnya.

sederhana sekali
sumber
1

i, j, k digunakan dalam sistem koordinat Cartesius. Dibandingkan dengan x dan y yang mewakili sumbu dalam sistem yang sama dan yang selalu digunakan sebagai variabel, kita dapat mengatakan bahwa i, j dan k juga berasal dari sana.

Sergey
sumber
1

"i" adalah untuk indeks.

Satu huruf memudahkan mata Anda untuk memindai baris kode. Untuk sesuatu yang umum seperti loop, satu karakter untuk indeks sangat ideal. Tidak ada kebingungan tentang apa arti "i" karena konvensi.

jojo
sumber
0

Ketika saya mulai pemrograman, Dartmouth BASIC masih baru. Semua variabel dalam hal ini dan beberapa bahasa lain pada saat itu adalah karakter tunggal. Tambahkan ke bahwa konvensi penamaan variabel FORTRAN dan fakta bahwa jauh lebih mudah untuk mengetik, hanya satu karakter, dan pemahaman dari programmer dan guru yang lebih tua. Saya tidak tahu, tapi kedengarannya bagus.

Dave
sumber