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

Car*_*los 179 language-agnostic variables

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

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

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

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

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

zwo*_*wol 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是正确的,这是因为我是索引中的第一个字母.

  • @SLott:为什么`i`用于数学? (93认同)
  • @ S.Lott:我怀疑它来自整数.我们使用ℤ(黑板粗体Z)表示整数,因为它代表德语单词*Zahlen*,表示*数字*.假设求和符号大约在同一时间出现,则基于德语的符号将被预期 - 德语单词*index*是*Index*,它也以*i*开头.我想不出很多在黑板上特别难写的字母.好吧,除了ξ:-) (26认同)
  • "这个惯例的存在是因为这个惯例以前存在过." 这就是词源的工作原理:没有人知道为什么特定的噪声在PIE中具有特定的意义.解释数学约定会很好,但问题是"为什么它们被用作控制结构中的计数器",所以在有人产生一个可以追溯到更远的答案之前,这是最好的.它至少推测它为什么用于数学.一个合适的数学历史学家可以找出,也许使用二进制印章.Euclid没有使用它,我打赌von Neumann做了.柯西怎么样?他经常使用索引 (14认同)
  • 我认为拉格朗日推荐使用a,b,c作为函数的常量,x,y,z作为函数的变量.i,j,k表示向量的"方向",并且像这样的形式和的因子可以被解释为等式的自由度[方向,通过另一个名称]. (14认同)
  • @Slaks:这是一个很好的问题.我实际上认为"i"可能来自整数而不是索引.我也觉得在黑板上写字很容易.回到70年代,我们被告知要确保我们以完全独特的方式编写了"i"和"j".事实上,我们被告知要把我们的"i"画成一个向后的"j",以便完全清楚它. (13认同)
  • 我发现的最古老的是1909年的HenriPoincaré:http://www.gutenberg.org/ebooks/15267 PDF page 35 (4认同)
  • @jon_darkstar,约定可能比FORTRAN旧,但是FORTRAN使用它们作为隐式类型声明,如果你将代码放入约定.毫无疑问,虽然我在整数中非常方便. (3认同)
  • 呵呵.我总是想象它是"迭代器"的"我". (2认同)
  • 老实说,这个答案很荒谬."这个惯例的存在是因为这个惯例以前存在过." 我并不反对它来自数学(它确实如此),但似乎没有人知道约会的起源.我已经问过这个问题10年了......没人知道. (2认同)
  • 我还记得那天我问过我的物理101讲师"你似乎在用什么涂鸦作为变量?" (2认同)
  • @Steve:我认为,我听说过zeta的*squiggle*和xi的*double squiggle*.我不相信希腊人不仅仅是对未来发表一个恶作剧:-)在一个稍微更热门的话题中,我想知道之前是否有任何关于数学词源的工作.有趣的是找出"正常子群"的"◁"或"和"的"∧"之类的东西. (2认同)
  • 这个答案是无稽之谈.总结滚动的事实常常和for循环一样有趣. (2认同)

Ign*_*ams 200

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

  • 我认为这来自于数学家似乎喜欢使用i,j,k作为求和和矩阵乘法指数的便利下标以及什么不是.我记得在早期的Fortran II手册中读到了一些相关内容.(是的,Fortran II.) (53认同)
  • 我通过`N`而不是'Q`教我```.谷歌似乎大多同意.(不同版本的FORTRAN?) (9认同)
  • 是的,FORTRAN发起了这些惯例. (5认同)
  • @learnvst - 因为数学家事先已经使用过i,j至少一个世纪了. (4认同)
  • 而且Fortran中的其他所有内容都是真实的.这引发了一个笑话"上帝是真实的,除非宣布整数". (2认同)

tim*_*day 195

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

  • 对我来说,这显然是最好的答案.(值得一提的是Michael Borgwardt的答案,该答案也引用了数学惯例,但并不具体.)我很抱歉你的不是被接受的.我所能做的就是给予我的支持. (17认同)
  • 这正是我们需要能够为社区接受的答案投票的原因(是的,我知道这属于uservoice). (3认同)

tva*_*son 129

i =整数

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

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

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

  • 嘿,FORTRAN的家伙从数学家那里得到了它! (10认同)
  • 我同意@timday.使用i作为系列的索引已经成为数学家至少2个世纪的实践. (6认同)
  • 我很确定它是FORTRAN. (4认同)
  • 雅,fortran .....它腐蚀了头脑.我们有一个程序员使用i ii和iii作为循环变量名.另一个症状是6个字符的变量/函数名称,没有元音. (4认同)
  • @tvan,我很确定从I到N**开始的变量默认**到整数,但你仍然可以将它们声明为真,因此笑话"上帝是真实的,除非声明整数".无论如何,因为我多年前的回忆可能并不完美. (4认同)
  • 我喜欢这样的历史文物.它增加了编程的深度,让我感觉与过去有关. (2认同)

SLa*_*aks 91

i代表 ndex.
j来之后i.

  • @Jack:我觉得@Pete在开玩笑;-) (33认同)
  • @Cpfohl:是的,只是想无聊:D (13认同)
  • 我认为他在谈论字母表,试着用一些想象力:) (12认同)
  • @Pete Kirkham:非常感谢Pete,这是我过去一个月里最好的笑声. (4认同)

eri*_*son 63

在电子计算机发明之前,这些符号在数学中被用作矩阵指数.


Mic*_*rdt 52

我认为它最有可能来自索引(在数学意义上) - 它通常用作总和或其他基于集合的操作的索引,并且很可能在编程语言之前就已经使用过了.

  • 对.诸如"Y =ΣXi"之和的数学符号在每种编程语言之前. (3认同)

Cha*_*art 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"用于加速度,位移,质量和速度的物理测量.这留下了三个连续字母之间没有那么多的空白而没有不必要的数学关联指数.

然后,正如其他几个人所注意到的那样,来自数学的约定对早期编程惯例有很大的影响,并且"α,β,γ"在许多早期字符集中都不可用.

  • 同意.尽管`a,b,c`是一个相当常用的序列,尽管`a`具有多重含义...... (2认同)

Car*_*los 32

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

替代文字

欧拉选择我作为想象单位.

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

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

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

  • 最后一个不同的问题方法,有趣点+1 (11认同)

Her*_*che 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
Run Code Online (Sandbox Code Playgroud)
i seems an index                    
j seems i (another index)
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)

  • 哦,男人,XXX似乎是什么?))+1为创造力;) (6认同)
  • o实际上似乎是一个对象 (5认同)
  • 我将n视为"数字",通常是一组中的元素数. (3认同)

Bre*_*dan 21

一个阳光明媚的下午,阿基米德有什么思考(正如平时下午的平常)并遇到他的伙伴Eratosthenes.

阿基米德说,"阿基米德向Eratosthenes问候!我正在努力想出一个解决几个球状刚体平衡比例的方法.我希望多次迭代这些身体,但我有一个可怕的时间保持跟踪我完成了多少次迭代!"

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

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

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

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

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

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


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

  • ......并且有字母`j`. (6认同)

Mic*_*hel 15

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

for (int i = 0; etc
Run Code Online (Sandbox Code Playgroud)

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

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

就像你给那些开始学习阅读的孩子拼写一个单词一样,你可以使用名字为他们拼写单词,如下所示:

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

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

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

  • `i`早于这种语法. (7认同)

Ale*_*all 14

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

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

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


小智 13

可能历史?

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

例如:

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


Chr*_*ann 13

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

你认为"i"代表它仍然"适合法案".

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

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


小智 13

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

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

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

而iota来自jot(iot),这也是一个小变化的代名词.

比照 http://en.wikipedia.org/wiki/Iota


MaD*_*Mad 13

好吧从数学:(拉丁字母)

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


tow*_*owi 11

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

  • 数学家使用ij自然数的公式(使用那些复杂的数字很少,至少)所以这结转到编程
  • 来自C,i暗示int.如果你需要另一个,int那就i2太长了,所以你决定使用j.
  • 有一些语言,第一个字母决定类型,i然后是integer.


Wal*_*ght 10

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


小智 7

它绝对来自数学,它早于计算机编程.

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

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


Ger*_*rat 6

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

:)

  • 在计算的早期,像素没有_exist_. (24认同)