为什么变量“i”和“j”用于计数器?

时间:2010-11-09 19:45:25

标签: variables language-agnostic

我知道这可能看起来像一个绝对愚蠢的问题,但我太好奇了,不要问......

为什么“i”和“j”成为大多数控制结构中用作计数器的变量?

虽然常识告诉我他们就像X,用于表示未知的价值,但我不禁认为必须有一个理由为什么每个人都一遍又一遍地以同样的方式进行教学。

是因为它实际上是推荐用于最佳实践或惯例,还是它背后有一些模糊的原因?

以防万一,我知道我可以给他们任何我想要的名字,并且变量名称不相关。

23 个答案:

答案 0 :(得分:330)

它最终来自数学:求和符号传统上使用 i 作为第一个索引, j 作为第二个索引,依此类推。示例(来自http://en.wikipedia.org/wiki/Summation):

  

\sum_{i=1}^{n} i = \frac{n^2 + n}{2}

它也用于那种方式的集合,比如你有一堆变量x 1 ,x 2 ,... x n < / sub>,然后任意一个将被称为x i

至于为什么会这样,我想SLaks是正确的,因为我是Index中的第一个字母。

答案 1 :(得分:200)

我相信它可以追溯到Fortran。从I到Q开始的变量默认是整数,其他是真实的。这意味着I是第一个整数变量,而J是第二个等等,所以它们在循环中使用了。

答案 2 :(得分:195)

数学家使用i,j,k很久以前(例如18361816)计算机就在代数(下标,序列,求和等)中指定整数(这是FORTRAN变量类型默认值)。使用字母表中的字母(...,x,y,z)表示未知变量的习惯以及从常量(a,b,c ...)开始使用常量的习惯通常是attributed到{ {3}},(另见Rene Descartes)所以我假设整数的i,j,k ... n(在字母表中间)也可能是由于他。

答案 3 :(得分:129)

i =整数

来自Fortran,其中整数变量必须以字母I到N开头,而实数变量以其他字母开头。因此,我是第一个也是最短的整数变量名。 Fortran是最早被广泛使用的编程语言之一,程序员使用它编写的习惯转移到其他语言。

编辑:我对从数学中得出的答案没有任何问题。毫无疑问,这是Fortran设计师获得灵感的地方。事实上,对我来说,无论如何,当我开始在Fortran中编程时,我们使用I,J,K,...用于循环计数器,因为它们很短并且是第一个合法允许的整数变量名。作为H.S的二年级学生我可能听说过笛卡尔(以及其他一些人),但在编程时与数学联系很少。事实上,我参加的第一门课程被称为“商业Fortran”,并不是由数学系教师,而是由商业/经济学教授。

对我来说,至少,变量的命名与数学没什么关系,但是由于我习惯于编写Fortran代码而习惯于其他语言。

答案 4 :(得分:91)

i代表 ndex j之后发现i

答案 5 :(得分:63)

这些符号在电子计算机发明之前很久就被用作数学中的矩阵指数。

答案 6 :(得分:52)

我认为它最有可能来自索引(在mathematical sense中) - 它通常用作sums或其他基于集合的操作中的索引,并且很可能已经以这种方式使用,因为之前有编程语言

答案 7 :(得分:47)

数学中有一种偏好,即在字母表中使用类似方式使用的“匿名”变量的连续字母。因此,不仅仅是“i,j,k”,还有“f,g,h”,“p,q,r”,“x,y,z”(很少有“u,v,w”前置),和“α,β,γ”。

现在“f,g,h”和“x,y,z”不能自由使用:前者用于函数,后者用于维度。 “p,q,r”也常用于函数。

然后对可用序列还有其他限制:避免使用“l”和“o”,因为它们在许多字体中看起来太像“1”和“0”。 “t”经常用于时间,“d&amp;δ”用于差分,“a,s,m,v”用于加速度,位移,质量和速度的物理测量。这留下了三个连续字母之间没有那么多的空白而没有数学上不需要的关联指数。

然后,正如其他几个人所注意到的,数学惯例对早期编程惯例有很大的影响,而“α,β,γ”在很多早期字符集中都没有。

答案 8 :(得分:32)

我找到了另一个可能的答案,可能是i,j和k来自Hamilton's Quaternions

alt text

欧拉选择我为虚构单位。

Hamilton需要两个-1的平方根:     ii = jj = kk = ijk = -1

汉密尔顿确实很有影响力,四元数是在1900年之前进行3D分析的标准方法。到那时,数学家习惯于将(ijk)视为匹配集。 矢量微积分取代了19世纪90年代的四元数分析,因为它是编写麦克斯韦方程的一种更好的方法。但是人们倾向于像这样写出矢量:(3i-2j+k) 而不是 (3,-2,1)。因此(ijk)成为R ^ 3中的标准基础向量。

最后,物理学家开始使用群论来描述微分方程组中的对称性。所以(ijk)开始意味着“被排列组交换的向量”,然后转向“类似索引的事物,这些事物在某些指定的集合中具有所有可能的值”,其中基本上是他们的在for循环中意味着。

答案 9 :(得分:30)

通过丢弃(有点偏见)

a seems an array
b seems another array 
c seems a language name
d seems another language name
e seems exception
f looks bad in combination with "for" (for f, a pickup?)
g seems g force
h seems height

i seems an index                    
j seems i (another index)

k seems a constant k
l seems a number one (1) 
m seems a matrix
n seems a node
o seems an output
p sounds like a pointer
q seems a queue
r seems a return value
s seems a string
t looks like time
u reserved for UVW mapping or electic phase 
v reserved for UVW mapping or electic phase or a vector
w reserved for UVW mapping or electic phase or a weight
x seems an axis (or an unknown variable)
y seems an axis
z seems a third axis

答案 10 :(得分:21)

一个阳光明媚的下午,阿基米德有什么思考(通常是阳光明媚的下午)并遇到他的伙伴Eratosthenes。

阿基米德说:“阿基米德对Eratosthenes问候!我正在努力想出一个平衡的几个球形刚体比例的解决方案。我希望多次迭代这些身体,但我有一个可怕的时间跟踪我已完成的迭代次数!“

Eratosthenes说,“为什么阿基米德,你成熟的梅花,你只能在沙子中标记连续的行,每个都跟踪你在迭代中完成的迭代次数!”

阿基米德向全世界喊道,他的好朋友无疑是一个闪亮的智慧灯塔,可以提出如此简单的解决方案。但阿基米德说,他喜欢在思考时在他的沙坑周围走来走去。因此,有可能失去追踪哪一排在最顶层,哪一排在底部。

“也许我应该用字母表中的字母标记这些行,以便我总是知道哪一行是哪个!你怎么想到这个?”他问道,然后补充道,“但是Eratosthenes ......我会用什么字母?”

Eratosthenes确信他不知道哪些字母最好,并且对阿基米德说了很多。但阿基米德并不满意,并继续促使可怜的图书管理员至少选择他目前的球体平衡解决方案所要求的两封信。

Eratosthenes终于厌倦了两封信的不断要求,大声喊道,“我只是不知道!!!”

所以阿基米德选择了Eratosthenes的感叹句中的前两个字母,并感谢他的朋友的贡献。


古希腊Java开发人员很快就采用了这些符号,剩下的就是......历史。

答案 11 :(得分:15)

我认为这是因为很多循环使用Int类型变量进行计数,比如

for (int i = 0; etc

当你打字的时候,你实际上是在脑海中说出来(就像你读的那样),所以在你的脑海里,你说'int ....'

当你必须在'int ....'后面写一封信时,你说/输入'i',因为这是你刚才说'int'时你想到的第一个字母/ p>

就像你给那些开始学习阅读的孩子拼出一个单词,用你的名字为他们拼写单词,如:

WORD拼写William W,Ok O,Ruby R,Done D

所以你根据第一个字母说Int I,Double d,Float f,string s等。

使用j是因为当你完成int I时,J紧随其后。

答案 12 :(得分:14)

我认为这是其他提到的原因的组合:

对于初学者来说,'i'通常被数学家用在他们的符号中,并且在计算的早期使用非二进制的语言(即必须以某种方式解析和调用),绝大多数用户计算机也是数学家(......和科学家和工程师),因此这种符号在计算机语言中用于编程循环,并且从那时起就一直存在。

结合这个事实,那些早期的屏幕空间非常有限,就像记忆一样,保留较短的变量名称是有意义的。

答案 13 :(得分:13)

i =迭代器,i =索引,i =整数

你认为“i”代表它仍然“适合法案”。

此外,除非在该循环中只有一行代码,否则您应该将iterator / index / integer变量命名为更有意义的变量。喜欢:employeeIndex

BTW,我通常在我的简单迭代器循环中使用“i”;除非它当然包含多行代码。

答案 14 :(得分:13)

i = iota,j = jot;两个小小的变化。

iota是希腊字母表中最小的字母;在英语中,它的含义与微小的变化有关,如“不是一个iota”(来自新约中的一句话:“直到天地消逝,而不是iota,而不是一个点,将从法律中消失” (太5:18))。

计数器表示值的微小变化。

来自iota的jot(iot),这也是一个小变化的同义词。

cf。 http://en.wikipedia.org/wiki/Iota

答案 15 :(得分:13)

可能是历史性的?

FORTRAN,可以说是第一个高级语言,默认情况下将i,j,k,l,m定义为Integer数据类型,并且循环只能由整数变量控制,约定会继续吗?

例如:

做100 i = j,100,5 .... 100继续 ....

答案 16 :(得分:13)

好的数学:(拉丁字母)

a,b:用作有理数的常数或整数
c:常数
d:衍生物
e:欧拉的数字
f,g,h:函数
i,j,k:是索引(也是单位向量和四元数)
l:一般不使用。看起来像1
m,n:是矩阵的行和列,或者是有理数的整数
o:也没有使用过(除非你的标记很少)
p,q:经常用作素数
r:有时是与素数相关的其他时间变量的空间变化
s,t:空间和时间变量或s用作t
的变量变量 u,v,w:变量的变化
x,y,z:变量

答案 17 :(得分:11)

我想是很多可能的主要原因:

  • 数学家在公式中使用ij来表示自然数(至少很少使用复数),所以这个延续到编程
  • C i提示到int。如果您需要其他int,那么i2太长了,所以您决定使用j
  • 有些语言中第一个字母决定了类型,而i则是integer

答案 18 :(得分:10)

它来自Fortran,其中i,j,k,l,m,n是隐式整数。

答案 19 :(得分:7)

它肯定来自数学,它早于计算机编程。

那么,如果来自数学呢?我完全没有受过教育的猜测是,正如一位同事所说,数学家喜欢使用字母簇来表示类似的事物 - f,g,h用于函数; x,y,z表示数值变量; p,q,r表示逻辑变量; u,v,w用于其他变量集,特别是在微积分中; a,b,c用于很多事情。 i,j,k对于迭代变量来说非常方便,而且大概耗尽了可能性。为什么不是m,n?好吧,它们用于整数,但更常用于迭代的终点而不是迭代变量本身。

有人应该问一位数学史家。

答案 20 :(得分:6)

计数器在程序中非常普遍,在计算的早期,所有都非常珍贵......
程序员自然会尝试保存像素,而'i'所需的像素比任何其他字母都要少。 (数学家,懒惰,因为同样的原因选择它 - 作为最小的字形) 如前所述,'j'自然而然地跟着......

:)

答案 21 :(得分:4)

我在1965年的Control Data Corp. 3100上学习了FORTRAN。以“I”到“N”开头的变量被暗示为整数。例如:'IGGY'和'NORB'是整数,'XMAX'和'ALPHA'是浮点数。但是,您可以通过显式声明来覆盖它。

答案 22 :(得分:4)

我出于多种原因使用它。

  • 通常我的循环是基于int的,所以 你做了一个完整的三角形 键盘输入“int i” 我处理的空间除外 我的拇指。这是一个非常快的 序列到。

  • “i”可以代表迭代器,整数,增量或索引,每个都是 逻辑意义。

由于我的个人用途被搁置,它的理论来自FORTRAN是正确的,其中整数变量使用字母I - N.