代码之家  ›  专栏  ›  技术社区  ›  Eric

为什么我们在循环中使用i作为计数器?[关闭]

  •  91
  • Eric  · 技术社区  · 16 年前

    我知道这看起来是一个非常愚蠢的问题,但我太好奇了,不去问…

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

    虽然常识告诉我,它们就像X一样,用来表示未知的值,但我不由得认为必须有一个理由,为什么每个人都会一遍又一遍地教同样的方法。

    是因为它实际上被推荐用于最佳实践,还是因为它背后有某种模糊的原因?

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

    0 回复  |  直到 10 年前
        1
  •  330
  •   zwol    14 年前

    它最终来自于数学:传统上使用的求和符号 对于第一个索引, J 第二次,等等。示例(来自 http://en.wikipedia.org/wiki/Summation ):

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

    它也被用来收集东西,比如如果你有一堆变量x ,X ,…X n ,则任意一个将被称为x .

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

        2
  •  200
  •   Ignacio Vazquez-Abrams    14 年前

    我相信它可以追溯到fortran。从i到q开始的变量默认为整数,其他变量为实数。这意味着 I 是第一个整型变量,并且 J 第二个,等等,所以他们倾向于循环使用。

        3
  •  195
  •   timday    16 年前

    数学家很久以前就用i,j,k来表示代数中的整数(下标,级数,和等)。 1836 1816 )计算机在附近(这是Fortran变量类型默认值的来源)。对于未知变量使用字母表末尾(…,x,y,z)的字母,对于常量使用字母表开头(a,b,c…)的习惯通常是 attributed Rene Descartes ,(也见) here )所以我想整数的i,j,k…n(在字母表中间)也可能是由于他。

        4
  •  129
  •   tvanfosson    16 年前

    i=整数

    来自fortran,其中整数变量必须以字母i到n开头,实数变量必须以其他字母开头。因此,我是第一个和最短的整数变量名。FORTRAN是最早被广泛使用的编程语言之一,程序员使用它开发的习惯也被移植到其他语言中。

    编辑 :我对它来自数学的答案没有异议。毫无疑问,这正是Fortran设计人员获得灵感的地方。事实上,对我来说,当我开始用fortran编程时,我们用i,j,k,…循环计数器,因为它们很短,是第一个合法允许的整数变量名。在H.S.读大二的时候,我可能听说过笛卡尔(以及其他一些人),但在编程时很少与数学联系。事实上,我所学的第一门课程叫做“Fortran for Currand”,并不是由数学教师教的,而是由商业/经济学院教的。

    至少对我来说,变量的命名与数学没什么关系,但一切都是因为我习惯于编写fortran代码,并将其移植到其他语言中。

        5
  •  91
  •   SLaks    14 年前

    i 代表 NDEX
    j 来后 .

        6
  •  63
  •   erickson    14 年前

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

        7
  •  52
  •   Michael Borgwardt    16 年前

    我认为它很可能是从索引(在 mathematical sense )-它通常被用作求和或其他基于集合的操作的索引,而且很可能是在有编程语言之前就被这样使用的。

        8
  •  47
  •   Charles Stewart    14 年前

    在数学中,人们倾向于在字母表中使用连续的字母来表示以类似方式使用的“匿名”变量。因此,不仅是“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”用于加速度、位移、质量和速度的物理测量。这使得连续三个字母之间没有太多的间隙,而在数学中没有多余的指数关联。

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

        9
  •  32
  •   lycono tddmonkey    14 年前

    我发现另一个可能的答案是,我,J,K来自 Hamilton's Quaternions .

    alt text

    欧拉选择我作为假想单位。

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

    汉弥尔顿确实很有影响力,而四元数是1900前进行三维分析的标准方法。那时,数学家们习惯于把(ijk)看作一个匹配集。 向量演算取代四元数分析 在19世纪90年代,因为它是一个 更好的方法 写麦克斯韦方程。但是人们倾向于这样写向量: (3i-2j+k) 而不是 (3,-2,1) . 因此(ijk)成为r^3中的标准基向量。

    最后,物理学家开始用群论来描述微分方程组中的对称性。所以(ijk)开始意味着“被置换组交换的向量”,然后逐渐趋向于“类似索引的东西,在某个指定的集合中接受所有可能的值”, 哪一个 基本上就是它们在for循环中的意思。

        10
  •  30
  •   Hernán Eche    14 年前

    抛弃(有点偏颇)

    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
    
        11
  •  21
  •   brendan    14 年前

    一个阳光明媚的下午,阿基米德在思考什么( 就像阳光灿烂的下午一样 )然后遇到了他的朋友埃拉托舍内斯。

    阿基米德说:“阿基米德向埃拉托申斯问好!我试图找到一个平衡状态下几个球形刚体比率的解。我希望多次遍历这些实体,但我花了很长时间来跟踪我完成了多少次迭代!”

    埃拉托舍内斯说:“为什么阿基米德,你这个成熟的孩子,你只需要在沙子上标记连续的行,每行记录你在迭代中所做的迭代次数!”

    阿基米德向全世界大声喊道,他伟大的朋友无疑是一个闪闪发光的智能灯塔,他提出了这样一个简单的解决方案。但阿基米德说,他喜欢在沉思时绕着沙坑转圈。因此,有可能丢失哪一行在上面,在底部。

    “也许我应该在这些行的旁边用字母表的一个字母标出,这样我就永远知道哪一行是哪一行了!你觉得怎么样?”他问,然后补充说,“但是埃拉托舍内斯……我该用什么字母?”

    埃拉托色尼确信他不知道哪封信是最好的,并对阿基米德说了这么多。但阿基米德不满意,继续催促这位可怜的图书管理员至少选择他当前的平衡解决方案所需的两封信。

    埃拉托舍内斯终于厌倦了两封信的不断要求,大喊:“我就是不知道!!

    因此阿基米德选择了埃拉托舍内斯感叹句中的前两个字母,并感谢他的朋友所做的贡献。


    这些符号很快被古希腊爪哇开发者所采用,剩下的是…历史。

        12
  •  15
  •   Michel    14 年前

    我认为这是因为很多循环使用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紧跟其后。

        13
  •  14
  •   Alex Marshall    14 年前

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

    对于初学者来说,“i”在数学家中常用于它们的符号,并且在早期的计算语言中,不是二进制的(必须以某种方式解析和词汇化),绝大多数计算机用户也是数学家(……)。科学家和工程师)因此,这种符号开始在计算机语言中用于编程循环,从那以后就一直存在。

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

        14
  •  13
  •   brett    16 年前

    可能是历史的?

    fortran是第一种高级语言,默认定义i、j、k、l、m为整数数据类型,循环只能由整数变量控制,这种约定还在继续吗?

    如:

    do 100 i=j,100,5 … 100继续 …

        15
  •  13
  •   Chris Pietschmann    16 年前

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

    不管你认为“我”代表什么,它仍然“合算”。

    此外,除非循环中只有一行代码,否则可能应该将iterator/index/integer变量命名为更有意义的变量。例如:EmployeeIndex

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

        16
  •  13
  •   Stephen    14 年前

    i=iota,j=jot;都是小变化。

    iota是希腊字母表中最小的字母;在英语中,它的意思与微小的变化联系在一起,如“没有一个iota”(来自新约中的一句话:“直到天地消逝,没有一个iota,没有一个点,会从法律中消失”(太5:18)。

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

    而从物联网来的jot(物联网),也是一个小变化的同义词。

    囊性纤维变性。 http://en.wikipedia.org/wiki/Iota

        17
  •  13
  •   MaDMaD Mad    14 年前

    数学好:(拉丁字母)

    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:变量

        18
  •  11
  •   towi    14 年前

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

    • 数学家使用 i j 对于 自然数 在公式中(使用 复数 很少,至少是这样),所以这就转到了编程上
    • C , 暗示 int . 如果你需要另一个 int 然后 i2 太长了,所以你决定用 J .
    • 有些语言中,第一个字母决定类型,并且 然后是 integer .
        19
  •  10
  •   Walter Bright    14 年前

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

        20
  •  7
  •   David Lewis    14 年前

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

    那么,如果数学是从哪里来的呢?我完全没有受过教育的猜测是,正如一个人所说,数学家喜欢用字母簇来做类似的事情——f,g,h代表函数;x,y,z代表数值变量;p,q,r代表逻辑变量;u,v,w代表其他变量集,特别是微积分;a,b,c代表很多东西。对于迭代变量,i,j,k是很有用的,关于用尽可能的。为什么不是M,N?好吧,它们用于整数,但更多的是迭代的终点,而不是迭代变量本身。

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

        21
  •  6
  •   Gerrat    14 年前

    计数器在程序中很常见,在计算的早期, 一切 是溢价…
    程序员很自然地试图保存像素,“i”需要的像素比任何其他字母都少。(数学家由于懒惰,选择它的原因和最小的象形文字一样)。
    如前所述,“J”只是自然地跟着…

    :)

        22
  •  4
  •   John T    16 年前

    我使用它有很多原因。

    • 通常我的循环是基于int的,所以 你在上面画了一个完整的三角形 用键盘输入“int i” 我处理的空间异常 我的拇指。这是非常快的 按顺序输入。

    • “i”可以表示迭代器、整数、增量或索引,其中每个 逻辑感。

    撇开我的个人用途不谈,从fortran派生出来的理论是正确的,其中整数变量使用字母i-n。

        23
  •  4
  •   Pierre    14 年前

    1965年,我在控制数据公司3100上学习了fortran。以“i”到“n”开头的变量被隐含为整数。例如:“iggy”和“norb”是整数,“xmax”和“alpha”是浮点。但是,您可以通过显式声明来覆盖它。