为什么变数“i”和“j”用于柜台?

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

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

虽然常识告诉我他们就像用来代表未知值的X,但我不禁要以为每个人都一次又一次地被教导的理由一定是有原因的。

是因为它实际上是推荐给最佳实践还是惯例,还是背后有一些模糊的理由?

为了以防万一, 我知道我可以给他们任何名字我想和variables名称是不相关的。

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

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

它也被用于收集事物,比如如果你有一堆variablesx 1 ,x 2 ,… x n ,那么任意一个将被称为x i

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

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

很久以前(例如1836年或1816年 )计算机(这是FORTRANvariablestypes的默认值的起源),math家们正在使用i,j,k来指定代数中的整数(下标,序列,求和等)。 对于未知variables以及从头开始(a,b,c …)使用字母(…,x,y,z)的常量的字母的习惯通常归因于笛卡尔 ( Rene Descartes )也在这里 ),所以我假设我,我,K … N(在字母表中)整数可能是由于他。

我=整数

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

编辑 :我没有问题的答案,它来自math。 毫无疑问,这就是Fortrandevise师的灵感来源。 事实上,无论如何,当我开始在Fortran编程时,我们使用I,J,K …作为循环计数器,因为它们很短,也是第一个合法允许的整数variables名称。 作为高中的大二,我可能听说过笛卡尔(还有其他几个人),但在编程时与math的联系却很less。 事实上,我所学的第一门课程叫做“Fortran for Business”,不是由math系教授的,而是由商业/经济学院教授的。

至less对于我来说,variables的命名与math无关,而是由于我编写Fortran代码的习惯,所有这一切都是由我编写的。

i代表指数。
ji之后。

这些符号早在电子计算机发明之前就被用作math的matrix指标。

我认为这很可能是从索引(从math意义上 )派生出来的 – 它通常被用作总和或其他基于集合的操作的索引,并且很可能在编程语言之前就以这种方式使用。

在math中有一个喜欢使用字母连续的字母为“匿名”variables使用类似的方式。 因此,不只是“i,j,k”,还有“f,g,h”,“p,q,r”,“x,y,z”(很less用“u,v,w”前置)和“α,β,γ”。

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

那么对可用序列还有其他限制:避免使用“l”和“o”,因为它们在许多字体中看起来太像“1”和“0”。 “t”通常用于时间,“d&δ”用于微分,“a,s,m,v”用于物理测量加速度,位移,质量和速度。 这样,连续三个字母之间的差距就没有那么多,没有不必要的math联系。

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

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

替代文字

欧拉select了我作为虚构的单位。

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

汉密尔顿真的很有影响力,而四元数是1900年以前做3D分析的标准方法。那时,math家习惯于把(ijk)看作一个匹配集合。 vector微积分在19世纪90年代取代了四元数分析 ,因为这是写麦克斯韦方程的更好方法 。 但是人们倾向于这样写vector: (3i-2j+k) 而不是 (3,-2,1) 。 所以(ijk)成为R ^ 3中的标准基础向量。

最后,物理学家开始使用群论来描述微分方程组的对称性。 因此,(ijk)开始意味着“由置换群组交换的向量”,然后向着“在指定集合中承担所有可能值的索引类事物”转移, 基本上是for循环中的含义。

通过丢弃(有点偏颇)

 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 

一个阳光明媚的下午,阿基米德有什么思索( 就像往常一样,阳光明媚的下午 ),碰上了他的好友埃拉托斯通内斯。

阿基米德说,“阿基米德到Eratosthenes的问候!我试图想出一个解决scheme,以平衡几个球形刚体的比例。我希望多次迭代这些身体,但我有一个可怕的时间跟踪我做了多less次迭代!“

Eratosthenes说:“为什么阿基米德,你熟悉的一个孩子的李子,你可能只是在沙子上连续排成一行,每个都跟踪迭代过程中迭代次数!”

阿基米德向全世界呼吁,他的好朋友无疑是一个shiny的智慧灯塔,提出这样一个简单的解决scheme。 但是阿基米德说,他喜欢在思考的时候围着他的沙坑散步。 因此,有失去追踪哪一排在最前面,哪一排在最后的风险。

“也许我应该用一个字母的字母把这些行标记在旁边,这样我就可以知道哪一行是哪一行!你怎么想的? 他问,然后补充说:“但Eratosthenes …我要用什么信?

Eratosthenes确信他不知道哪个字母最好,对阿基米德说的也是一样。 但是,阿基米德并不满意,并继续鼓励这位可怜的图书pipe理员至lessselect他目前的球体平衡解决scheme所需要的两封信。

Eratosthenes终于厌倦了对两封信的不断请求,大声说:“我只是不知道!

所以阿基米德select了埃拉托斯泰内斯感叹句中的前两个字母,并感谢他的朋友的贡献。


这些符号很快被古希腊Java开发者所采用,其余的就是…历史。

我认为这是因为很多循环使用一个Inttypes的variables来进行计数

 for (int i = 0; etc 

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

当你必须在'int ….'之后编写一个字母时,你会说/input'i',因为这是你刚才说'int'时的第一个字母,

就像你给开始学习阅读你的孩子拼写一个词,用你的名字拼写单词,如下所示:

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

所以你说第一个字母是基于第一个字母的Int I,Double d,Float f,String s等。

j被使用,因为当你完成了int I之后,J紧随其后。

我认为这是其他原因的结合:

对于初学者来说,“我”是math家们常用的符号,而在计算机初期,语言不是二元的(即必须以某种方式进行分析和parsing),绝大多数计算机用户是还有math家(…和科学家和工程师),所以这些符号被编程循环的计算机语言所使用,并且从此一直停留在那里。

结合这一点,在早期的屏幕空间是非常有限的,作为记忆,保持较短的variables名是有意义的。

可能历史?

FORTRAN,第一个高级语言,默认定义i,j,k,l,m为Integer数据types,循环只能用整型variables来控制。

例如:

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

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

哪一个你认为“我”代表它仍然“符合法案”。

另外,除非在循环中只有一行代码,否则应该将iterator / index / integervariables命名为更有意义的内容。 像:employeeIndex

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

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

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

计数器代表一个值的小变化。

从iota来的jot(iot),这也是一个小变化的代名词。

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

那么从math:(拉丁文字母)

a,b:用作常量或用于有理数的整数
c:一个常数
d:派生
e:欧拉号码
f,g,h:function
i,j,k:是索引(也是单位向量和四元数)
l:一般不用。 看起来像1
m,n:是matrix的行和列,或者是有理数的整数
○:也没用过(除非你有点小记)
p,q:常用作素数
r:有时是与素数有关的其他时间variables的空间变化
s,t:空间和时间variables或s被用作t的variables的变化
u,v,w:variables的变化
x,y,z:variables

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

  • math家在公式中使用ij作为自然数 (至less很less使用复数 ),所以这个过程继续到编程
  • Ci暗示为int 。 如果你需要另一个int那么i2只是太长了,所以你决定使用j
  • 有第一个字母决定types的语言, i是一个integer

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

它绝对来自计算机编程之前的math。

那么,如果来自math呢? 我完全没有受过教育的猜测是,正如一位同胞所说的,math家喜欢用类似的东西的字母集合 – f,g,h来表示函数; x,y,z代表数字variables; p,q,r为逻辑variables; u,v,w用于其他variables,尤其是微积分; a,b,c很多东西。 我,j,k派上用场迭代variables,而这个耗尽了可能性。 为什么不呢? 那么,它们用于整数,但更多的是迭代的终点,而不是迭代variables本身。

有人应该问一位math史家。

计数器在程序中非常普遍,而且在计算机初期, 一切都很珍贵。
程序员自然而然地想要保存像素,“i”所需要的像素比任何其他字母都要less。 (math家,懒惰,因为同样的原因select – 作为最小的雕文)。
如前所述,“j”自然而然地跟随着…

🙂

我使用它的原因有很多。

  • 通常我的循环是基于int的,所以你在键盘上input一个完整的三angular形,除了我用拇指处理的空间之外,input“int i”。 这是一个非常快速的input序列。

  • “我”可以代表迭代器,整数,增量或索引,每一个都是合乎逻辑的。

随着我个人的使用搁置,它的理论从FORTRAN派生是正确的,其中整数variables使用字母I – N.

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