5

どういうわけか、ループ内の変数を非常に一般的に使用iしていることを私たちは知っています。jダブルforループが必要な場合は、次のようなものを使用する可能性が非常に高くなります。

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

ただし、forこれらのループに3番目のループが必要な場合は、3番目のイテレーターの命名規則はありません。私は、おそらく次の変数を使用します:r、、、kなど。iijj

3番目(など...)のループのイテレータの命名規則はありますか?

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

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

たぶん、この単純なループではやり過ぎ/冗長で、一意の名前を見つけるだけでなく、ネストされたループの名前付けの問題に対処できる方法がたくさんあることを強調したかっただけです。

于 2012-08-11T12:46:30.327 に答える
2

これらのことについて確立された規則はありません。i基本的なループには問題ありません。より複雑なループの場合、または実装が一目でわからない場合は、イテレータに明示的に名前を付けることを検討する必要があります。たとえばsurveyIndex、andquestionIndexではなくiandjです。

于 2012-08-11T12:19:23.300 に答える
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;
    }
}

ここでは、C++での別の実装を見ることができます。

于 2012-08-11T12:44:06.310 に答える
1

私は実際にはほとんどiを使用しません。私は、、、、cntまたはindexのようなものを好みますid。1つcntはまだ短く、すばやく入力できます。"i"また、人々はあなたのコードを見るとすぐにそれが何であるかを知るでしょう、それはカウンターであり、そして最も重要なことに、あなたが見たくないたくさんのがらくたを得るようなものを検索しようとすると

include <iostream>

int main ()

//hi there, this is a comment

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

一方、 iの代わりにCtrl+Fインデックス使用する場合、またはcntの場合はさらに多くの場合、期待するものしか表示されないため、ナビゲートする方がはるかに快適です。

より複雑なループの場合は、変数のフルネームを確実に入力する必要がありますが、そうでない場合は混乱するだけです。

于 2015-01-07T16:01:14.920 に答える