2012-08-11 73 views
3

我们知道,我们知道,在很多情况下,我们在循环中使用ij变量。如果一个人需要一个双for循环,它很可能使用类似以下内容:循环迭代器命名约定

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

不过,如果我需要在这些循环第三for循环,我没有第三迭代任何命名约定。我,会使用以下变量:rkiijj等等

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

+5

我真诚地认为,如果你有3个嵌套循环这样,你应该想到“重构“而不是如何命名变量。 – 2012-08-11 12:14:56

+1

逻辑会倾向于使用下一个字母(k),这就是说 - @JoachimIsaksson有一个好点 – MimiEAM 2012-08-11 12:17:52

回答

4

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

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

VS

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); 
} 

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

2

这些东西没有建立的惯例。 i适用于基本循环。对于更复杂的循环或实现一目了然的情况,您应该考虑明确指定迭代器,例如, surveyIndexquestionIndex,而不是ij

2

的情况并不少见看到计算机视觉应用嵌套循环,并为对方表示,没有约定,至少字母的顺序,但一般人倾向于使用字母i,j,k,l,m,n,q,h...

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

/* 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; 
    } 
} 

Here可以看到在C++另一实现。

0

我其实几乎从来没有使用我,我更喜欢像cntindexid。对于一个cnt仍然很短并且很快输入。也有人会立刻知道它是什么,当他们看你的代码,这是一个计数器,当您尝试使用搜索类似"i"你会得到很多的垃圾最重要的是你不希望看到

include <iostream> 

int main() 

//hi there, this is a comment 

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

而如果你Ctrl+F指数,而不是,甚至更多所以CNT你只会看到你期望什么,所以它更舒适的进行导航。

对于更复杂的循环虽然你绝对应该,虽然输入变量的全名,你只是来迷惑自己,否则