5

我们知道,不知何故,我们非常普遍地在循环中使用ij变量。如果需要双for循环,很可能会使用以下内容:

for (int i = 0; i < n; i++)
{
    for (int j = 0; j < m; j++)
    {
        // do some stuff...
    }
}

但是,如果我需要for在这些循环中使用第三个循环,则我对第三个迭代器没有任何命名约定。我,可能使用以下变量:r, k, ii,jj等等...

第三个(等等......)循环的迭代器是否有命名约定?

4

4 回答 4

7

可读性最重要的应该是明显的名称
i 和 j不是最明显的,但对于简单的情况可能没问题。考虑这个(诚然有些考虑不周)的例子;

static void Main(string[] args)
{
    for(int i = 0; i < 100; i++)
        for (int j = 0; j < 100; j++)
            for (int k = 0; k < 100; k++)
                Console.WriteLine("" + i + "-" + j + "-" + k);
}

对比

static void Main(string[] args)
{
    for(int survey = 0; survey < 100; survey++)
        for (int question = 0; question < 100; question++)
            for (int option = 0; option < 100; option++)
                Console.WriteLine("" + survey + "-" + question + "-" + option);
}

很容易看出哪个更有意义。但是,当我们这样做时,如何使它更具可读性,同时进一步消除您的命名问题?

static void Main(string[] args)
{
    for(int survey = 0; survey < 100; survey++)
        PrintSurvey(survey);
}

private static void PrintSurvey(int survey)
{
    for (int question = 0; question < 100; question++)
        PrintQuestion(survey, question);
}

private static void PrintQuestion(int survey, int question)
{
    for (int option = 0; option < 100; option++)
        PrintOption(survey, question, option);
}

private static void PrintOption(int survey, int question, int option)
{
    Console.WriteLine("" + survey + "-" + question + "-" + option);
}

对于这个简单的循环,可能有点矫枉过正/冗长,只是想说明有更多方法可以处理嵌套循环的命名问题,而不仅仅是找到唯一的名称。

于 2012-08-11T12:46:30.327 回答
2

在计算机视觉应用程序中看到嵌套循环并不少见,正如其他人所说,没有约定,至少在字母的顺序上,但通常人们倾向于使用字母i,j,k,l,m,n,q,h...

例如,这是用于过滤图像的二维离散卷积的可能实现:

/* The Input image I and Output image O have M*N pixels.  
 * The kernel H has size (2k+1)*(2k+1)
 */
for (i=k; i<M-k; i++) {
    for (j=k; j<N-k; j++) {
        temp=0;
        for (m=-k; m<=k; m++)
            for (n=-k; n<=k; m++)
                temp = temp + I[i-m,j-n] * H[m+k,n+k];
        O[i,j] = temp;
    }
}

在这里,您可以看到 C++ 中的另一个实现。

于 2012-08-11T12:44:06.310 回答
2

这些事情没有既定的惯例。i适用于基本循环。对于更复杂的循环或实现一目了然的地方,您应该考虑明确命名迭代器,例如surveyIndexand questionIndex,而不是iand j

于 2012-08-11T12:19:23.300 回答
1

实际上,我几乎从不使用 i,我更喜欢cnt, or index, or之类的东西id。因为一个cnt仍然很短而且打字很快。此外,人们在查看您的代码时会立即知道它是什么,它是一个计数器,最重要的是,当您尝试使用搜索类似的东西时,"i"您会得到很多您不想看到的垃圾

include <iostream>

int main ()

//hi there, this is a comment

for (int i = 0; i < 5; i++)

而如果您Ctrl+F使用index而不是i,或者更使用cnt,您只会看到您期望的内容,因此导航起来会更加舒适。

对于更复杂的循环,尽管您绝对应该输入变量的全名,否则您只会感到困惑

于 2015-01-07T16:01:14.920 回答