有谁想过为什么我们中的很多人会使用相同的变量名来重复这种模式?
for (int i = 0; i < foo; i++) {
// ...
}
我看过的大多数代码似乎都将
i
,j
,k
等用作迭代变量。我想我是从某个地方捡来的,但我想知道为什么这在软件开发中如此普遍。是我们所有人都从C中获取的东西还是类似的东西?
我的脑后发痒了一段时间。
#1 楼
i
和j
通常在相当长时间的数学中都用作下标(例如,即使在早于高级语言的论文中,您也经常看到“ Xi,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;
幸运的是,这种情况很少见,现在大多数样式指南都指出,虽然描述性的变量名很长很有用,但您并不总是需要它们,尤其是对于像这样的变量,变量范围仅一两行代码。
评论
+1我在这里没有考虑过数学相关性。这是一个有趣的认识。
– Casey Patton
2011年6月25日下午0:14
+1归因于某些人认为是精神病的精神病。
– Crashworks
2011年6月25日下午2:21
好的-为什么将i和j用作数学的下标?我认为这种用法早于FORTRAN :-)我确信Knuth知道...
– Guy Sirton
2011年6月25日下午3:38
@Guy'i'用于索引,j是i之后的下一个字母
–马丁·贝克特(Martin Beckett)
2011年6月25日下午4:02
正如杰里提到的那样,在大多数情况下,i和j很好,甚至更好。一个更大的问题是循环如此之大,以至于您无法在一个屏幕上看到和理解整个事物。需要对其进行重构,以使其更加简洁。
– Craig
15年2月28日在8:30
#2 楼
i
-索引。用于索引循环迭代的临时变量。如果您已经拥有
i
,那么比去j
,k
等更自然呢?在这种情况下,也经常使用
idx
。 ,并确切显示变量的用法,如变量名一样。评论
ijk =“我只是在开玩笑”。 :-)
–马哈茂德·霍萨姆(Mahmoud Hossam)
11年6月24日在23:59
你可以引用参考吗?
–路易斯·瑞斯(Louis Rhys)
2011年6月25日9:46
如果需要,可以引用我作为参考。
–明智的船长
2011年6月26日下午0:01
也许值得补充一下,它通常是在循环中访问的数组的字面量(下标)。并非总是如此,但是无论您是否将其视为交互的索引,从通用的一类循环到更广泛的一类循环仍然很方便。顺便说一句-个人狂-对我而言,“索引”往往意味着类似“数据库索引”的内容,包括内存中的键到下标字典/反转表,因此为了避免歧义,我更喜欢“下标”而不是“索引”。但是我仍然使用i进行循环。
–Steve314
2011年7月22日在12:01
在您的思路中,我也可以指代迭代器。
–totymedli
13年4月10日在8:07
#3 楼
在FORTRAN中,i
是默认为整数类型的第一个字母。隐式整数类型的所有范围都是以字母i
至n
开头的任何类型。使用三个维度的循环可以得到i
,j
和k
。该图案继续增加尺寸。同样,“ x”,“ y”和“ z”默认为浮点,用于需要实数的循环变量。正如
litleadv
所指出的,i
也是索引的最小收缩。 鉴于这些变量的本地使用,如果不使用更具描述性的名称,我认为没有问题。
评论
对于单循环,我同意,但是对于包含循环的循环,我需要更多描述。
–爱德华·古奇
11年6月24日在23:54
最终答案是惯性。我从1973年开始与WATFOR(Waterloo FORTRAN)合作,直到2011年仍在这样做。
– Peter Rowell
2011年6月25日下午0:01
@Crazy Eddie:如果循环包含很多功能,我会同意。但是对于紧密嵌套的循环,代码的长度应为n + 1或2n + 1的数量级,其中n为维数。在这种情况下,较长的变量名可能会降低可读性。
–BillThor
2011年6月25日在0:04
+1是“ In Fortran”的原因,因为这就是这种传统的开始方式-不管您是否喜欢Fortran都没关系。
– artem
2011年6月25日在2:26
#4 楼
我相信它来自求和:评论
有趣!这早于FORTRAN,但在CS的背景下?
–kprobst
2011年6月25日下午6:18
由于Backus拥有数学硕士学位,这似乎是合乎逻辑的。
–dbasnett
2011-6-25 14:13
大部分早期的CS天才都是数学或电气工程领域,这需要大量的数学知识。即使在今天,您的平均“计算机呆子”通常也具有高于平均水平的数学技能,因为数学和计算机是如此地以逻辑为导向。
– corsiKa
2011年8月19日在17:21
#5 楼
几年前,除了我的计算机理论教授,我还被告知,其起源是数学求和符号。 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代表索引。至少这是我从我在学校学习过的数学中学到的东西。这种说法可能已经转移到了计算上,因为一开始许多计算机科学家都是数学家,或者至少具有很强的数学背景。 br />
#7 楼
i ==迭代器或索引我的理解一直是'i'是个不错的选择,因为循环通常用于迭代或遍历已知索引步骤。字母'j'和'k'遵循得很好,因为经常需要嵌套循环,并且大多数人本能地知道'j'==第二索引和'k'==第三索引,因为它们遵循字母表中的模式。此外,在遵循此标准约定的情况下,许多人可以放心地假设“ k”循环可能会包含“ j”和“ i”循环。
#8 楼
i,j,k用于笛卡尔坐标系。与表示同一系统中的轴且始终用作变量的x和y进行比较,我们可以说i,j和k也来自那里。#9 楼
“ i”用于索引。单个字母可使您更轻松地扫描代码行。对于像循环这样常见的事物,索引的单个字符是理想的。由于约定,“ i”的含义没有引起混淆。
评论
很久以前就已经问过SO了;也许这些应该迁移到这里:stackoverflow.com/questions/454303/…和stackoverflow.com/questions/4137785/…它是一个重复的问题,我喜欢这个答案。由于名称Dijkstra。
我一直以为i,j和k取自D ijk stra
顺便说一句:我总是使用ii(和jj,kk,...),以便在搜索时更容易定位。
您还会使用什么?