Tại sao hầu hết chúng ta sử dụng 'i' làm biến đếm vòng lặp?


126

Có ai nghĩ về lý do tại sao rất nhiều người trong chúng ta lặp lại mô hình tương tự bằng cách sử dụng cùng một tên biến?

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

Nó dường như hầu hết các mã mà tôi từng nhìn sử dụng i, j, kvà như vậy là biến lặp.

Tôi cho rằng tôi đã nhặt nó lên từ đâu đó, nhưng tôi tự hỏi tại sao điều này lại phổ biến trong phát triển phần mềm. Có phải đó là thứ mà tất cả chúng ta nhặt được từ C hoặc một cái gì đó tương tự?

Chỉ là một cơn ngứa tôi đã có một lúc ở phía sau đầu của tôi.


4
Đã hỏi một thời gian ngắn trước đây về SO; có lẽ những người cần được di chuyển ở đây: stackoverflow.com/questions/454303/...stackoverflow.com/questions/4137785/...
BlueRaja - Danny Pflughoeft

8
Đó là một câu hỏi trùng lặp và tôi thích câu trả lời này. Vì cái tên D ijk stra .
Vivart

2
Tôi luôn luôn nghĩ rằng i, j và k được lấy từ từ D IJK Stra
Christian Kjær

1
BTW: Tôi luôn luôn sử dụng ii(và jj, kk...) để nó dễ dàng hơn để xác định vị trí khi tìm kiếm.
Sabuncu

1
Bạn sẽ sử dụng cái gì khác?
Thorbjørn Ravn Andersen

Câu trả lời:


205

ijthường được sử dụng như các mục con trong khá nhiều toán học trong một thời gian khá lâu (ví dụ, ngay cả trong các bài báo có ngôn ngữ cấp cao hơn, bạn thường thấy những thứ như "X i, j ", đặc biệt là trong những thứ như tổng kết).

Khi họ thiết kế Fortran, họ (dường như) đã quyết định cho phép giống nhau, vì vậy tất cả các biến bắt đầu từ "I" đến "N" mặc định thành số nguyên và tất cả các biến khác thành số thực (dấu phẩy động). Đối với những người đã bỏ lỡ nó, đây là nguồn gốc của trò đùa cũ "Chúa là có thật (trừ khi số nguyên được tuyên bố)".

Hầu hết mọi người dường như đã thấy ít lý do để thay đổi điều đó. Nó được biết đến và hiểu rộng rãi, và khá cô đọng. Thỉnh thoảng bạn lại thấy một thứ được viết bởi một kẻ tâm thần nào đó nghĩ rằng có một lợi thế thực sự cho thứ gì đó như:

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;

Rất may, điều này khá hiếm, và hầu hết các hướng dẫn về phong cách hiện chỉ ra rằng mặc dù các tên biến mô tả dài thể hữu ích, nhưng bạn không cần luôn có chúng, đặc biệt là đối với những thứ như thế này trong đó phạm vi của biến chỉ là một dòng hoặc hai mã .


13
+1 Tôi đã không nghĩ về mối tương quan toán học ở đây. Đây là một nhận thức thú vị.
Casey Patton

79
+1 để quy cho loạn thần những gì một số người tưởng tượng là phong cách.
Crashworks

2
OK - vậy tại sao i và j được sử dụng làm chỉ số trong toán học? Tôi nghĩ việc sử dụng này có trước FORTRAN :-) Tôi chắc chắn Knuth biết ...
Guy Sirton

34
@Guy 'i' là dành cho chỉ mục, j là chữ cái tiếp theo sau i
Martin Beckett

3
i và j đều ổn hoặc thậm chí tốt hơn trong hầu hết các trường hợp, như Jerry đã ám chỉ. Một vấn đề lớn hơn là các vòng lặp quá lớn mà bạn không thể nhìn thấy và hiểu toàn bộ sự việc trên một màn hình. Những người cần được tái cấu trúc để họ súc tích hơn.
Craig

63

i - mục lục.

Một biến tạm thời được sử dụng để lập chỉ mục vòng lặp. Nếu bạn đã có tài i, có chuyện gì tự nhiên hơn sẽ j, kvà vân vân?

Trong bối cảnh đó idxthường được sử dụng là tốt.

Ngắn gọn, đơn giản và hiển thị chính xác cách sử dụng của biến là tên biến.


35
ijk = "Tôi chỉ đùa thôi". :-)
Mahmoud Hossam

2
bạn có thể trích dẫn một tài liệu tham khảo?
Louis Rhys

23
Bạn có thể trích dẫn tôi như một tài liệu tham khảo nếu bạn muốn.
Thuyền trưởng Sensible

1
Có lẽ đáng để thêm rằng nó thường theo nghĩa đen là một chỉ mục (chỉ mục) vào một mảng được truy cập trong vòng lặp. Không phải lúc nào cũng vậy, cho dù bạn có xem nó như một chỉ mục trong các tương tác hay không, thì vẫn thuận tiện để khái quát hóa từ một lớp vòng lặp chung sang một lớp vòng lặp rộng hơn. BTW - sự quái đản cá nhân - đối với tôi "chỉ mục" có xu hướng ngụ ý một cái gì đó như "chỉ mục cơ sở dữ liệu", bao gồm từ điển khóa-bảng con / bảng đảo ngược trong bộ nhớ, vì vậy tôi thích "chỉ mục" hơn là "chỉ mục" để tránh sự mơ hồ. Nhưng tôi vẫn sử dụng icho các vòng lặp.
Steve314

3
Trong chuyến tàu tư tưởng của bạn icó thể có nghĩa là lặp.
totymedli

39

Trong FORTRAN ilà chữ cái đầu tiên mặc định cho kiểu số nguyên. Phạm vi đầy đủ của các loại số nguyên ẩn là bất kỳ bắt đầu bằng các chữ cái iđến n. Làm việc với các vòng cho ba khía cạnh đã đẩy chúng ta i, jk. Các mô hình tiếp tục cho kích thước bổ sung. Tương tự, 'x', 'y' và 'z' được mặc định là điểm nổi trong đó được sử dụng cho các biến vòng lặp yêu cầu số thực.

Như litleadvghi chú, icũng là một sự co lại tối thiểu cho chỉ số.

Với việc sử dụng cục bộ các biến này, tôi không thấy vấn đề gì khi không sử dụng tên mô tả nhiều hơn.


Đối với các vòng đơn tôi đồng ý, nhưng đối với các vòng chứa vòng lặp tôi thích mô tả thêm một chút.
Edward Strange

1
Cuối cùng, câu trả lời là quán tính . Tôi đã bắt đầu thực hiện nó với WATFOR (Waterloo FORTRAN) vào năm 1973 và ... Tôi vẫn đang thực hiện nó vào năm 2011.
Peter Rowell

1
@Crazy Eddie: Nếu các vòng lặp chứa nhiều chức năng, tôi sẽ đồng ý. Nhưng với các vòng lặp lồng nhau chặt chẽ, độ dài của mã phải theo thứ tự n + 1 hoặc 2n + 1 trong đó n là số lượng kích thước. Trong trường hợp đó, tên biến dài hơn có thể làm giảm khả năng đọc.
BillThor

11
+1 cho "Ở Fortran" vì đó là cách truyền thống đó bắt đầu - không quan trọng bạn có thích Fortran hay không.
artem

34

Tôi tin rằng nó đến từ Tổng kết :

Tổng kết


3
Hấp dẫn! Điều này có trước FORTRAN, nhưng trong bối cảnh của CS?
kprobst

3
Vì Backus có bằng Thạc sĩ toán học, nó có vẻ hợp lý.
dbasnett

9
Hầu hết các thiên tài CS thời kỳ đầu đều học toán hoặc kỹ thuật điện, đòi hỏi toán học mở rộng. Ngay cả ngày nay, "mọt máy tính" trung bình của bạn thường có các kỹ năng toán học trung bình, bởi vì toán học và máy tính được định hướng logic.
corsiKa

8

Tôi đã được cho biết, trong một bên bởi lý thuyết của giáo sư tính toán của tôi một vài năm trước đây, rằng nguồn gốc là từ ký hiệu tổng hợp toán học. i, j, k thường được sử dụng làm biến lặp số nguyên và nó được chuyển từ các văn bản ban đầu về lý thuyết tính toán (tất nhiên chủ yếu là toán học ứng dụng). Rõ ràng nhìn vào công việc của Knuth et al. ủng hộ điều này

x, y, z như các phép lặp dấu phẩy động dường như xuất hiện cùng với sự phổ biến của Fortran trong các ngành khoa học vật lý, từ các nhà nghiên cứu vật lý chuyển đổi tích phân sang mã nguồn (vì các tích hợp thường vượt qua giới hạn không gian ... khi x chuyển sang 100 et cetera)

Tôi không có tài liệu tham khảo để sao lưu điều này, nhưng như tôi nói, nó đến từ một giáo sư khá già và dường như rất có ý nghĩa.

Hi vọng điêu nay co ich


6

Tôi nghĩ rằng i, j, k được sử dụng trong Toán học để chỉ ra các chỉ số trong tổng và cho các phần tử ma trận (i cho các hàng và j cho các cột). Trong ký hiệu toán học, một số chữ cái có xu hướng được sử dụng với ý nghĩa cụ thể thường xuyên hơn các ký tự khác, ví dụ a, b, c cho các hằng số, f, g, h cho các hàm, x, y, z cho các biến hoặc tọa độ, i, j, k cho các chỉ số. Ít nhất đây là những gì tôi nhớ lại từ môn Toán tôi đã học ở trường.

Có thể ký hiệu này đã được chuyển sang điện toán vì lúc đầu, nhiều nhà khoa học máy tính là nhà toán học hoặc ít nhất là có nền tảng toán học mạnh mẽ.


3

i == iterator hoặc chỉ mục

Sự hiểu biết của tôi luôn luôn là 'i' là một lựa chọn tốt vì các vòng lặp thường dùng để lặp hoặc duyệt qua một bước chỉ mục đã biết. Các chữ cái 'j' và 'k' tuân theo tốt vì các vòng lặp lồng nhau thường cần thiết và hầu hết sẽ biết theo bản năng 'j' == chỉ số thứ hai và 'k' == chỉ số thứ ba vì chúng tuân theo mẫu đó trong bảng chữ cái. Ngoài ra, với nhiều người tuân theo quy ước tiêu chuẩn này, người ta có thể giả định một cách an toàn một vòng lặp 'k' sẽ có các vòng lặp 'j' và 'i' bao bọc nó.


1

i, j, k được sử dụng trong hệ tọa độ Descartes. So sánh với x và y đại diện cho các trục trong cùng một hệ thống và luôn được sử dụng làm biến, chúng ta có thể nói rằng i, j và k cũng xuất phát từ đó.


1

"I" là dành cho chỉ mục.

Một chữ cái giúp mắt bạn dễ dàng quét dòng mã hơn. Đối với một cái gì đó phổ biến như vòng lặp, một ký tự duy nhất cho chỉ mục là lý tưởng. Không có sự nhầm lẫn về "i" có nghĩa là gì do quy ước.


0

Khi tôi bắt đầu lập trình, Dartmouth BASIC mới. Tất cả các biến trong này và một số ngôn ngữ khác tại thời điểm đó là các ký tự đơn. Thêm vào đó là quy ước đặt tên biến FORTRAN và thực tế là việc nhập dễ dàng hơn nhiều, chỉ có một ký tự và sự hiểu biết từ các lập trình viên và giáo viên lớn tuổi. Tôi không biết, nhưng nó có vẻ tốt.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.