int i vs int index等哪一个更好?

时间:2010-05-21 23:55:58

标签: variables coding-style iterator naming-conventions

  

可能重复:
  Is a variable named i unacceptable?
  What is an ideal variable naming convention for loop variables?

来自C背景我总是使用int i作为泛型循环变量。当然,在大型嵌套循环或其他复杂的东西中,我可能会使用一个描述性的名称但你更喜欢看哪一个?

int i;
for(i=0;i<Controls.Count;i++){
  DoStuff(Controls[i]);
}

int index;
for(index=0;index<Controls.Count;index++){
  DoStuff(Controls[index]);
}

在我正在进行的当前项目中,这两种样式和索引都被ndx取代。

哪一个更好? i变量是否过于通用?还有其他C风格的名字呢? i, j, k所有这些都应该被实际的描述性变量所取代吗?

11 个答案:

答案 0 :(得分:14)

然而,

i在第一个循环方面非常标准,内部循环后跟j,内部循环后跟k,依此类推。 / p>

与几乎所有的命名规则一样,只要它是项目中的标准规则,并且适用于所有成员,那就没关系。

答案 1 :(得分:8)

如果可能的话,我会赞成描述性名称,因为我们应该努力寻找可读代码。

对于紧密代码块中使用的临时变量,可以接受短变量名称。

但是如果循环或代码块很长,最好有一个更长的描述性变量名称,如果没有其他原因,它会使文本搜索更容易。

答案 2 :(得分:5)

如果要使用嵌套循环来访问多维数组元素,则必须使用描述性迭代器名称来创建自我注释代码。 例如,

for(int i=0;i<someMax;i++){ 
  for(int j=0;j<someOtherMax;j++){ 
    DoStuff(someArray[i,j]); 
  }
} 

VS

for(int row=0;row<someMax;row++){ 
  for(int column=0;column<someOtherMax;column++){ 
    DoStuff(someArray[row,column]); 
  }
} 

答案 3 :(得分:4)

短变量名称很棒,但它们的范围应该很小。他们应该遵守语言的惯例。直到今天,我的Haskell和ML代码将具有函数值变量fgh以及monadic计算m,unnknown类型的变量{{ 1}}和a,以及未知元素类型bas的列表。但这些变量的范围将仅限于短函数或bs子句。

我的C代码将包含名为whereijpqs的变量。但是这些变量的范围将局限于单个循环(所有赞美C99和C ++反向移动!)或短函数。无论是循环索引还是其他变量,大范围内出现的内容都会获得更长的名称。

答案 4 :(得分:3)

我经常使用单字母变量作为计数器。 这是我如何循环,详尽地使用字母表中的字母:

for (int i = 0, l = array.length; i < l; i ++) {
  for (int j = 0, m = array[i].length; j < m; j ++) {
    for (int k = 0, n = array[i][j].length; k < n; k ++) {
      for (int o = 0, p = array[i][j][k].length; o < p; o ++) {
        for (int q = 0, r = array[i][j][k][o].length; q < r; q ++) {
          for (int s = 0, t = array[i][j][k][o][q].length; s < t; s ++) {
            for (int u = 0, v = array[i][j][k][o][q][s].length; u < v; u ++) {
              for (int w = 0, x = array[i][j][k][o][q][s][u].length; w < x; w ++) {
                for (int y = 0, z = array[i][j][k][o][q][s][u][w].length; y < z; y ++) {
                  f(array[i][j][k][o][q][s][u][w][y]);
                }
              }
            }
          }
        }
      }
    }
  }
}

答案 5 :(得分:3)

项目可见性的范围应该决定需要的名称的描述性。

如果你确实有一个微小的循环,i,j和k是很好的典型索引计数器。有时,更具描述性的名称可以帮助阐明意图,但如果for循环设置如下,那么更具描述性的名称并不重要。

for (int i = 0; i < totalCount; ++i)
{
   Thing& myThing = things[i];

   // do stuff with myThing, never refer to i again
}

那就是说,除非一贯使用,否则不应使用缩写。我个人认为ndx是一个可怕的标识符,因为它很难打字;我可以很好地输入英语,我的编程速度不受打字速度的限制。如果您想说indexindex

我相信在实用程序员中,他们说你不应该使用缩写,因为人们永远不会知道使用什么缩写。我知道我想要一个名为index的东西,所以我输入index但是我收到编译错误。怎么办? (通过代码搜索,发现它写的ndx会打扰我。)

当我试着考虑它时,关于我使用的唯一不是游戏特定的缩写是'num'代表'numberOf'。除此之外,我使用'npc'表示非玩家角色,'ai'表示人工智能等等,有时我使用小块的缩写,例如在相机上运行的10行功能可能只称它为“凸轮”,但范围很小,因此很容易看出发生了什么,并且混淆的可能性有限。

范围小 - &gt;做你喜欢的事(只要有一定的一致性)。大范围 - &gt;使您的名字明确,有意义且易于输入。 (通过“易于打字”我的意思是“容易记住如何拼写”以及“不要过分”。)

答案 6 :(得分:2)

在命名时,一切都与清晰度有关。我会说大多数看代码的人都知道“int i”是某种索引,但他们可能认为这是一种普通的老式用法。因此,如果它做了一些聪明的事情(即不仅仅是简单的计数),你应该把它称为使事实清楚的东西。

答案 7 :(得分:1)

如果它是小块,并且没有嵌套for循环,我很好,这几乎是不成文的规则,只要它出现,我就是一个循环增量变量。在更复杂的一切中,良好的命名至关重要。

答案 8 :(得分:1)

就个人而言,我使用i,j而不是循环变量,当语言允许时,我倾向于尝试使用为每个 - 我发现它更好。

答案 9 :(得分:1)

当我解析像位图这样的二维对象时,我经常使用xy

for (int (y = 0; y < height; y++)
{
    for (int x = 0; x < width; x++)
    {
        // work
    }
}

答案 10 :(得分:0)

我从不使用单字母变量名称,原因很简单 - 您是否曾尝试在文件或多个文件中搜索某个变量的所有出现?最好使用一些不那么模糊和更易搜索的东西。