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


179

我知道这似乎是一个绝对愚蠢的问题,但是我很好奇,不想问...

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

尽管常识告诉我它们就像X一样,用于表示未知值,但我不禁要认为一定有一个原因,使得每个人都一遍又一遍地以相同的方式被教导。

是因为它实际上是为最佳做法或惯例而推荐的,还是它背后有些晦涩的原因?

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


17
i =迭代,而j =交互后
ajreal,2010年

7
没有选择奇怪的“ c”?就像在Intel'cx'计数器寄存器中一样。


16
为什么实际的问题仅仅因为受欢迎而成为社区Wiki?这让人很想起共产主义。如果有人发明了非常酷的东西,政府就会窃取该发明并与社区分享。
orokusaki 2010年

9
关闭错误的方式:这里的答案是比其他QN更多的信息...
查尔斯·斯图瓦特

Answers:


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,则任意将被称为x i

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


93
@SLott:为什么i在数学中使用它?
SLaks 2010年

13
@Slaks:这是一个很好的问题。我实际上认为“ i”可能来自整数而不是索引。我也认为在黑板上写字很容易。早在70年代,我们就被警告确保以完全不同的方式编写“ i”和“ j”。的确,我们被告知绘制“ i”就像绘制“ j”一样,以使其完全清楚。
S.Lott

26
@ S.Lott:我怀疑它来自整数。我们对整数使用ℤ(黑板上的粗体Z),因为它代表德语单词Zahlen,它表示数字。假设总和符号大约在同一时间出现,则应该使用基于德国的符号-德语的index单词是Index,它也以i开头。而且我想不出很多很难在黑板上写的字母。好吧,除了ξ:-)
Antal Spector-Zabusky 2010年

14
“存在此约定是因为该约定以前已经存在。” 这就是词源学的工作方式:没有人知道为什么特定的噪声在PIE中具有特定的含义。解释数学惯例会很好,但是问题是“为什么将它们用作控制结构中的计数器”,因此,除非有人给出进一步的答案,否则这是最好的。它至少可以推测出为什么将其用于数学。一个合适的数学历史学家可以找出答案,也许使用二进制印章。欧几里得没有使用它,我敢打赌冯·诺伊曼使用过。柯西怎么样?他经常使用索引
Steve Jessop

14
我认为是拉格朗日建议将a,b,c用作函数的常数,并将x,y,z用作函数的变量。i,j,k表示向量的“方向”,像这样的形式和的因子可以解释为等式的自由度[方向,换句话说,方向。
大卫2010年

200

我相信它可以追溯到Fortran。从I到Q开头的变量默认情况下为整数,其他为实数。这意味着它I是第一个整数变量,J第二个等等,因此它们不适合在循环中使用。


53
我认为这来自数学家似乎喜欢使用i,j,k作为求和和矩阵乘法索引的便利下标的方式。我记得在早期的Fortran II手册中读到过有关此内容的内容。(是,Fortran II。)
S.Lott 2010年

5
是的,FORTRAN源自这些约定。
JE队列

9
我教IN没有Q。谷歌似乎大都同意。(FORTRAN的不同版本?)
休·艾伦

2
默认情况下,Fortran中的其他所有内容都是真实的。这就引出一个笑话,“上帝是真实的,除非声明为整数”。
Lagerbaer

4
@learnvst-因为数学家至少在一个世纪之前就使用过i,j。
马丁·贝克特

195

数学家早在(例如18361816)计算机出现之前(这是FORTRAN变量类型默认值的起源)就使用i,j,k在代数中指定整数(下标,系列,求和等)。从字母末尾(...,x,y,z)开始使用字母作为常量的习惯,从常量开始以(a,b,c ...)开始使用常量的习惯通常归因Rene Descartes,也在这里),所以我认为整数的i,j,k ... n(在字母中间)也可能是由于他。


17
对我来说,这显然是最好的答案。(对Michael Borgwardt的回答表示赞赏,它也引用了数学惯例,但没有那么具体。)很抱歉,您的答案未被接受。我所能做的就是全力以赴。
约翰Y

3
这正是我们需要能够为社区接受的答案投票的原因(是的,我知道这属于uservoice)。
Kredns

嘿。我偶尔会在此答案中更新到旧版Google图书的链接,因为Google不断在砍杂东西。偶然地,我注意到现在链接的1816年文件包括查尔斯·巴贝奇(Charles Babbage,作者是不同发动机/分析发动机的成名者)。因此可以说,这是计算机程序员首次使用整数变量“ i”的示例:^)
timday

..OK 1816链接不会转到带有“ i”的页面,但是它们在那里。
09年

129

i =整数

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

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

至少对我而言,变量的命名与数学无关,但一切归因于我习惯于编写用其他语言编写的Fortran代码的习惯。


4
我很确定这是FORTRAN。
Cade Roux

4
是的,fortran .....糟透了。我们有一个使用i ii和iii作为循环变量名称的程序员。另一个症状是没有元音的6个字符变量/函数名称。
EvilTeach

4
@tvan,我很确定从I到N开头的变量默认为整数,但是您仍然可以将它们声明为真实,因此开玩笑说“上帝是真实的,除非声明为整数”。无论如何+1,因为我这么多年以前的回忆可能并不完美。
paxdiablo

10
嘿,FORTRAN的家伙把它从数学家那儿弄了!
09年

6
我同意@timday。至少2个世纪以来,数学家一直在使用i作为系列的索引。
Scottie T 2009年

91

i代表I ndex。
j来了i


12
我认为他是在谈论字母,请尝试发挥想象力:)
杰克2010年

33
@Jack:我认为@Pete在开玩笑;-)
Chris Pfohl,2010年

13
@Cpfohl:是的,只是想很无聊:D
杰克

4
@Pete Kirkham:非常感谢Pete,这是我过去一个月以来最好的笑声。
2010年

@SLaks ...我相信您的权利是i = Index,它来自数学en.wikipedia.org/wiki/Index_notation中使用的索引符号, 或者这是一个很好的参考physics.ucsb.edu/~physCS31/fall2010/index- notation.pdf
John Hartsock 2010年

63

这些符号早在发明电子计算机之前就已用作数学中的矩阵索引。


52

我认为它很可能是从索引派生的(在数学意义上)-它通常被用作求和或其他基于集合的操作的索引,并且很可能自从编程语言出现以来就已经被使用过。


好答案。(对我而言)确实似乎是最可能的解释。
Noldorin

3
对。诸如此类的和的数学符号Y = Σ Xi位于每种编程语言之前。
Treb

我每次使用索引时都在考虑索引i。但是最初我使用它主要是因为我在其他地方看过的所有代码都使用了它,并且可能是从Fortran程序员那里继承的……
敬畏

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&δ”用于微分,“ a,s,m,v”用于加速度,位移,质量和速度的物理度量。这样就不会在没有连续索引的情况下在索引数学上造成不必要的联系而留下很多空白。

然后,正如其他一些人所注意到的那样,数学惯例对早期编程惯例有很大的影响,并且“α,β,γ”在许多早期字符集中都不可用。


2
同意 a, b, c尽管a具有多种含义,它还是一个相当常用的序列...
Stobor

32

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

替代文字

欧拉(Euler)为虚构单元选择了i。

汉密尔顿还需要-1的两个平方根: ii = jj = kk = ijk = -1

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

最后,物理学家开始使用群论来描述微分方程系统中的对称性。因此(ijk)开始表示“被置换组交换的向量”,然后转向“采用索引的事物,这些事物在某些指定集中具有所有可能的值” ,这基本上就是for循环的含义。


11
最后,该问题的解决方法有所不同,有趣的是+1
Fabian 2010年

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

3
我将n视为number,通常是集合中元素的数量。
汤姆·莱斯

6
天哪,XXX似乎是什么?))为创造力+1;)
Hovhannes Grigoryan

有时我很高兴,在大多数情况下,我不必为别人想到的这类
记号

21

一个阳光明媚的下午,阿基米德沉思了一下(像往常一样阳光明媚的下午),遇到了他的好友Eratosthenes。

阿基米德说:“阿基米德人向Eratosthenes致意!我正在尝试解决平衡状态下几个球形刚体的比率。我希望多次遍历这些刚体,但我一直在紧张地追踪时间我完成了多少次迭代!”

Eratosthenes说:“为什么阿基米德,你是个开玩笑的成熟李子,你只能在沙滩上标记连续的行,每行都记录你在一次迭代中完成的迭代次数!”

阿基米德向世人大声疾呼,他的好朋友无可否认是提出这样一个简单解决方案的智慧的灯塔。但是阿基米德说,他喜欢沉思时喜欢在沙坑周围转圈。因此,存在丢失跟踪哪一行在顶部,哪一行在底部的风险。

“也许我应该在侧面上用字母标记这些行,以便我将始终知道哪一行是哪一行?您对此有何看法?” 他问,然后补充道:“但是Eratosthenes ...我该用什么字母?”

Eratosthenes确信他不知道哪个字母是最好的,于是对阿基米德说了很多。但是阿基米德并不满意,并继续敦促这位可怜的图书管理员至少选择他要为当前球体平衡解决方案所需的两个字母。

Eratosthenes终于厌倦了不断要求两个字母的声音,大喊:“我只是不知道!!!”

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


这些符号被古希腊Java开发人员迅速采用,其余的都是…历史。


6
...并收到信j
安德鲁·格林

哇,这几乎读起来就像从霍夫斯塔特的创业板龟和阿喀琉斯的故事
ProfK

15

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

for (int i = 0; etc

当您打字时,您实际上会在脑海中说出来(就像阅读时一样),因此在您的脑海中,您会说“ int ....”

当您必须在“ int ....”之后写一个字母时,您说/输入“ i”,因为这是您刚刚说出“ int”时想到的第一个字母

就像您向开始学习阅读的孩子拼写单词一样,您可以使用名称来拼写单词,例如:

单词拼写William W,Ok O,Ruby R,Done D

所以您说第一个字母为Int I,Double d,Float f,string s等。

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


7
i在此语法之前。
SLaks 2010年

1
这是使孩子混为一谈的好方法。你真的教你那样拼写吗?
Lightness Races in Orbit

14

我认为这是上述其他原因的组合:

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

再加上早期的屏幕空间非常有限,内存也是如此,因此保留较短的变量名是有意义的。


13

可能是历史性的?

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

例如:

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


FWIW,我通常跳过字母L,因为它看起来太像数字1
Nosredna

13

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

无论您用哪个“ i”代表它,仍然“符合要求”。

另外,除非在该循环中只有一行代码,否则可能应该将iterator / index / integer变量命名为更有意义的名称。像:employeeIndex

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


13

i = iota,j =记号;两者都是小的变化。

iota是希腊字母中最小的字母;在英语中,它的含义与微小的变化相关,例如“没有一个iota”(摘自《新约》中的一句话:“直到天堂和大地逝去,没有一个iota,不是一个点,才会从法律中消失”) (太5:18))。

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

joot(iot)来自于iota,这也是小改变的代名词。

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


13

来自数学的好:(对于拉丁字母)

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


11

我猜有很多可能的主要原因:

  • 数学家使用ij在公式中表示自然数(至少很少使用复数的自然数),因此将其延续到编程中
  • 来自Ci提示来int。而且,如果您需要另一个,int那就i2太长了,因此您决定使用j
  • 有些语言的第一个字母决定类型,i然后是integer


7

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

那么,数学从哪里来呢?我完全没有根据的猜测是,就像一个人所说的那样,数学家喜欢对相似的事物使用字母簇-f,g,h代表函数;x,y,z用于数字变量;p,q,r表示逻辑变量;u,v,w用于其他变量集,尤其是在微积分中;a,b,c有很多东西。i,j,k对于迭代变量非常有用,而这将耗尽所有可能性。为什么不m,n?好吧,它们用于整数,但是更多时候是迭代的终点,而不是迭代变量本身。

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


6

计数器在程序中是如此普遍,在计算的早期,一切都非常宝贵……
程序员自然地尝试保存像素,并且“ i”所需要的像素少于其他任何字母。(数学家们很懒,出于同样的原因选择了它-因为它是最小的字形)。
如前所述,“ j”自然而然地...

:)


24
在计算的早期,像素不存在
SLaks 2010年

1
@Slaks,这是一个获奖的评论。只需看我脸上的笑容,然后阅读票数即可。真好!
ProfK 2010年

“程序员自然会尝试保存像素,并且'i'表示的像素要少于其他任何字母代表的像素。” <<<真好笑。
ocodo 2011年

1
...因此,过早的优化诞生了!
Gerrat 2011年

4

我使用它的原因有很多。

  • 通常,我的循环是基于int的,因此您在键盘上键入“ int i”时会形成一个完整的三角形,但我用拇指处理的空间除外。这是一个非常快速的键入序列。

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

撇开我的个人用途,从FORTRAN派生的理论是正确的,其中整数var使用字母I-N。


4

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

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.