为什么我们大多数人都将“ i”用作循环计数器变量?


126

有没有人想过为什么我们中的很多人使用相同的变量名重复相同的模式?

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

看来我曾经看着用途大多数代码ijk等为迭代变量。

我想我是从某个地方捡来的,但是我想知道为什么这在软件开发中如此普遍。是我们所有人都从C中获得的东西还是类似的东西?

我的脑后已经痒了一段时间。


4
很久以前就已经问过SO了;也许那些应该在这里迁移:stackoverflow.com/questions/454303/...stackoverflow.com/questions/4137785/...
BlueRaja -丹尼Pflughoeft

8
它是一个重复的问题,我喜欢这个答案。由于名称D ijk stra。
维瓦尔特2011年

2
我一直认为i,j和k取自D ijk stra
ChristianKjær2012年

1
顺便说一句:我总是使用ii(和jj,,kk...),以便在搜索时更容易定位。
Sabuncu 2015年

1
您还会使用什么?
托尔比约恩Ravn的安徒生

Answers:


205

i并且j通常在相当长的一段时间内都被用作数学的下标(例如,即使在比高级语言更早的论文中,您也经常看到“ X i,j ”之类的东西,尤其是在诸如求和之类的东西中)。

在设计Fortran时,他们(显然)决定允许这样做,因此所有从“ I”到“ N”开头的变量都默认为整数,所有其他变量都为实数(浮点数)。对于那些错过它的人来说,这是古老的笑话“上帝是真实的(除非声明整数)”的根源。

大多数人似乎没有什么理由改变这一点。它是众所周知的并且很简洁。有时,您会看到一些精神病患者写的东西,他们认为这样的东西确实有好处:

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;

值得庆幸的是,这是非常罕见的,虽然,多数风格指南现在指出,虽然长的,描述性的变量名可以是有用的,你并不总是需要他们,尤其是对于这样的事情,其中的变量的作用域只有一两行的代码。


13
+1我在这里没有考虑过数学相关性。这是一个有趣的认识。
Casey Patton

79
+1归因于精神病,有些人认为是风格。
Crashworks

2
好的-为什么将i和j用作数学的下标?我认为此用法早于FORTRAN :-)我确信Knuth知道...
Guy Sirton

34
@Guy'i'用于索引,j是i之后的下一个字母
Martin Beckett

3
正如杰里提到的那样,在大多数情况下,i和j很好,甚至更好。一个更大的问题是循环太大,以至于您无法在一个屏幕上看到和理解整个事情。需要对其进行重构,以使其更加简洁。
Craig

64

i -索引。

用于索引循环迭代的临时变量。如果您已经有一个i,那么比转到jk等等更自然呢?

在这种情况下,idx也经常使用。

简短,简单,并准确显示变量的用途,如变量名一样。


35
ijk =“我只是在开玩笑”。:-)
Mahmoud Hossam

2
你可以引用参考吗?
Louis Rhys

23
如果需要,可以引用我作为参考。
机敏队长,

1
也许值得补充一下,它通常是在循环中访问的数组的字面量(下标)。并非总是如此,但是无论您是否将其视为交互的索引,从通用的一类循环到更广泛的一类循环仍然很方便。顺便说一句-个人狂-对我而言,“索引”倾向于暗示类似“数据库索引”的内容,包括内存中的键到下标字典/倒排表,因此为了避免歧义,我更喜欢“下标”而不是“索引”。但是我仍然使用i循环。
Steve314,2011年

3
在您的思路中,i也可能意味着迭代器。
totymedli

39

在FORTRAN i中,第一个默认为整数类型的字母。隐式整数类型的所有范围都是以字母开头in。与三个层面的循环工作得到了美国ijk。该图案继续增加尺寸。同样,“ x”,“ y”和“ z”默认为浮点,用于需要实数的循环变量。

需要litleadv注意的i是,索引的最小收缩也是。

考虑到这些变量在本地使用,不使用更具描述性的名称不会出现问题。


对于单循环,我同意,但是对于包含循环的循环,我需要更多描述。
Edward Strange

1
最终答案是惯性。我从1973年开始与WATFOR(滑铁卢FORTRAN)合作,但直到2011
Peter Rowell

1
@Crazy Eddie:如果循环包含很多功能,我会同意。但是对于紧密嵌套的循环,代码的长度应为n + 1或2n + 1的数量级,其中n为维数。在这种情况下,较长的变量名可能会降低可读性。
BillThor

11
+1是“ In Fortran”的原因,因为这就是这种传统的开始-无论您是否喜欢Fortran都没关系。
artem 2011年

34

我相信它来自求和

求和


3
有趣!这早于FORTRAN,但在CS的背景下?
kprobst 2011年

3
由于Backus拥有数学硕士学位,这似乎是合乎逻辑的。
dbasnett 2011年

9
大部分早期的CS天才都是数学或电气工程领域,这需要大量的数学知识。即使在今天,您的平均“计算机呆子”通常也具有高于平均水平的数学技能,因为数学和计算机是如此地以逻辑为导向。
2011年

8

几年前,我的计算理论教授还告诉我,其起源是数学求和符号。i,j,k通常用作整数迭代变量,它从早期的计算理论(当然主要是应用数学)转移过来。显然是在研究Knuth等人的工作。支持这一点。

x,y,z作为浮点迭代器显然是随着Fortran在物理科学中的流行而出现的,这是由物理学研究人员将积分转换为源代码(因为积分通常在空间范围内,因为x达到100等等)。

我没有参考来支持这一点,但是正如我所说,它来自一位相当老的教授,似乎很有道理。

希望这可以帮助


6

我认为i,j,k在数学中用于表示总和和矩阵元素的索引(i代表行,j代表列)。在数学符号中,某些字母倾向于比其他字母更具有特定含义,例如,a,b,c代表常数,f,g,h代表函数,x,y,z代表变量或坐标,i,j, k为索引。至少这是我从我在学校修过的数学中学到的东西。

也许此概念已转移到计算上,因为一开始许多计算机科学家都是数学家,或者至少具有很强的数学背景。


3

i ==迭代器或索引

我的理解一直是“ i”是一个不错的选择,因为循环通常用于迭代或遍历已知索引步骤。字母'j'和'k'遵循得很好,因为经常需要嵌套循环,并且大多数人本能地知道'j'==第二索引和'k'==第三索引,因为它们遵循字母表中的模式。此外,在遵循此标准约定的情况下,许多人可以放心地假设“ k”循环可能会包含“ j”和“ i”循环。


1

i,j,k用于笛卡尔坐标系。与表示同一系统中的轴且始终用作变量的x和y进行比较,可以说i,j和k也来自那里。


1

“ i”用于索引。

单个字母使您的眼睛更容易扫描代码行。对于像循环这样常见的事物,索引的单个字符是理想的。由于约定,“ i”的含义没有混淆。


0

当我开始编程时,Dartmouth BASIC是新手。当时,该语言和某些其他语言中的所有变量都是单个字符。除了FORTRAN变量命名约定外,它的键入也很容易,只有一个字符,并且得到了较老的程序员和老师的理解。我不知道,但这听起来不错。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.