web-dev-qa-db-ja.com

ループの外側と内側で変数を宣言することに違いはありますか?

私がこのようなものを書いたとしても、違いはありますか:

int row,col;
    for(row = 0; row < data.length; row++){
        for(col = 0; col < data[row].length;col++){
            //do something
        }//end for loop(columns)
    }//end for loop(rows)
    for(row = 0; row < data.length; row++){
        for(col = 0; col < data[row].length;col++){
            //do something
        }//end for loop(columns)
    }//end for loop(rows)

に比べ:

    for(int row = 0; row < data.length; row++){
        for(int col = 0; col < data[row].length;col++){
            //do something
        }//end for loop(columns)
    }//end for loop(rows)
    for(int row = 0; row < data.length; row++){
        for(int col = 0; col < data[row].length;col++){
            //do something
        }//end for loop(columns)
    }//end for loop(rows)

どちらからもメリットはありますか?

2
user3189506

簡単な答え:ほとんどの場合、ループの外側の値は気にしないので、2番目の形式を使用します。

場合によっては、値が取得した範囲を表すように、ブレーク(またはループの終了条件)を設定する「最初のインデックス」が必要になります。次に、最初の形式を使用しますが、それを早期に停止させるブレークまたはループ条件を使用します。

...例えば。配列内の最初のゼロ以外の値のインデックスを見つけます。

編集:私はあなたのコードをもっと詳しく調べました...変数宣言を保持するためだけに同じインデックス変数を再利用することは決してありません;)lol!

2
Rob

どちらのバージョンにも特定の目的がある場合があります。

1内部の変数

反復に使用されます(はい、イテレータと拡張ループについては知っていますが、古いものを使用しましょう)

2外部の変数

ある配列からアイテムのインデックスを検索し、そのインデックスを他の何かに使用したいとします。インデックスが必要になるため、ループスコープの変数を使用することはできません。インデックスはループスコープの外になければなりません。

例:

int i;
for (i = 0; i < length; i++) {
  if (someConditionAppliedForAnElement(arr[i])) {
    break;
  }
}
if (i != length) { /* logic here */ }

もちろん、これは単なる例であり、このタスクを実行するためのより良い方法がありますが、ループスコープが適合しない場合があることを指摘したいと思います。

ちなみに、サンプルではループスコープインデックスを使用します。

2
Silviu Burcea