0

[編集] おっと、コードに誤りがあり、質問に対するすべての応答が奇妙に見えますが、基本的に for ループは for(i=0; i<15; i++) でした。また、質問をより明確にするために編集しました。[/編集]

16 要素の配列をチェックする for ループを作成しようとしているため、0 から 15 までループします。後で i 変数を使用しますが、i == 16 の場合があり、範囲外になることで問題が発生します。

解決策はありますが、エレガントに見えないため、何かが足りないと思います。while ループを試してみましたが、ループを 0 から 15 に変更することはできず、15 を超える値で終了することもありません。

ループの最後で 15 を超えないようにしながら、ループを実行して配列の 16 要素すべてをチェックする方法はありますか?

int i;

for(i=0; i<16; i++)
{
    someClass.someMethod(i);

    if(someClass.Test())
    {
        break;
    }
}



if (i == 16)
{
    i = 15;
}
4

15 に答える 15

3

次のことを知っておくと便利かもしれません。

for (before; check; after) { body } 

それは次と同じです:

before 
while(check) { 
  body 
  after 
} 

その項の for ループを考えてみると、出口で i が 16 である理由が簡単にわかるでしょう。

于 2009-04-28T22:58:55.300 に答える
3

あなたのアプローチにはいくつかの根本的な欠陥があるようです。

  1. ループのスコープ外でインデックス変数を実際に使用するべきではありません。
  2. 変数または関数を使用して、ループの制限を決定する必要があります。
  3. 数値インデックスの代わりに反復子を使用することをお勧めします。
  4. ジェネリック アルゴリズムは、ループの必要性をなくすことができます。

ちょうど私の 0.02 ドル。

于 2009-04-29T03:22:04.247 に答える
3

まず、サンプル コードは 0 から 14 までループします。しかし、0 から 15 までループする場合、当然、ループが終了するには i が 16になる必要があります。何が起こるかというと、それが 16 になると、ループは範囲外であることに気づき、抜け出します。15 で終了させたい場合、正直なところ、最も簡単な方法は、ループ終了直後にデクリメントすることです。

于 2009-04-28T22:49:18.427 に答える
3

i は最後のチェックで 16 になるようにインクリメントされますが、これは 15 未満ではないため、ループは i が 16 で終了します。

于 2009-04-28T22:50:26.130 に答える
1

したがって、16 要素の配列をチェックする場合、通常は次のようにします。

for(i=0; i<16; i++)

どのように機能するかは、最初の 3 つのステートメントから始まります。

i=0

次に、2 番目のステートメントでチェックを行います。

i < 16 // True here, since 0 < 16

それはあなたのループの前に起こります。次に、そのセットでループのブロックを実行します。

someClass.array[i]; //0

最後に、最終ステートメントを実行します。

i++

次に、2 番目と 3 番目のステートメントを順番に繰り返します。

最後の実行の前に、i == 14 であり、i++ を実行して i を 15 に設定し、ブロックを実行します。最後に、次のように設定して i++ を実行します。

i==16

この時点で、条件は真ではなくなります。

i < 16 // False, since i==16

この時点で、ブロックは実行されませんが、i はまだ 16 に設定されています。

于 2009-04-28T22:53:11.007 に答える
0

ここで理解すべき重要な問題は、「iのどの値がテストを成功させるのか」という質問に対して17の異なる答えがあるということです。iが{0、1、...、15}にあるか、iの値がない場合、テストは成功します。この場合、i==16で示されます。したがって、iが16の値のみに制限されている場合、質問に答えることはできません。

最後の有効な値を超えたくない正当な場合があります。たとえば、256個の値があり、何らかの理由でカウントするバイトが1つしかない場合です。または、最近私に起こったように、配列のi番目の要素すべてのみを調べたい場合、イテレータに最後に追加すると、配列の終わりをはるかに超えてしまいます。このような場合、ループ展開が必要です。

ただし、この問題の場合は、フラグを使用する方がクリーンです。

bool flag = false;
for (int i = 0; i < 15; ++i) 
{
    someClass.someMethod(i);

    if (someClass.Test())
    {
        flag = true;
        break;
    }
}

そうすれば、テストが成功したかどうかは明らかです。

于 2009-04-29T00:52:14.810 に答える
0

技術的には、ループのi終了時に 15 になるようにループを記述する方法がありますが、それらを行うべきではありません。

int i = 0;
while (1) {
    someclass.someMethod(i);
    if (i < 15) {
        i++;
    } else {
        break;
    }
}

はい、それはあなたが求めることを行います。しかし流れがひどい。

于 2009-04-28T23:10:54.960 に答える
0

ビルトインのループ構造ではこれを達成することはできません。Bill The Lizard が言ったように、おそらく for ループ変数を再利用したくないでしょう。

しかし、どうしてもやりたい場合は、次の方法があります。トリックは、ループ条件をループの途中に置くことです。

int i = 0;
while (true)
{
    someclass.array[i];
    if (i == 15)
        break;
    ++i;
}
于 2009-04-28T23:16:32.263 に答える
0
for(int i=0; i<17; i++)
{    
  if(i<16)
  {
     someClass.someMethod(i); 
     if(someClass.Test())   
     {        
       break;    
     }
  }
  else if(i==16)
  {
     i=15;
  }
}
于 2009-05-01T08:18:51.990 に答える
0

ループは、次のforループと同等ですwhile

i = 0;
while(i < 16) {
    someClass.array[i];

    i++;
} // while

iループから正しく抜け出すには、16 に到達する必要があります。

于 2009-04-28T22:57:39.560 に答える
0

16 個の要素を持つ配列があると言う場合、それを定義する必要はありません。配列を使用してその情報を取得してください (情報を複製しないでください)。

その後、最後のインデックスを再度取得する場合は、配列を使用してその情報を取得します。

for(int i = 0; i < myArray.length; ++i){
       myArray[i].somemethod();
}
// lastindex = myArray.length-1;
于 2010-11-16T09:37:27.107 に答える
0

あなたは何かを逃したに違いない。

このループでは、15 にさえ達しません。i <= 15 と言う必要があります。i = 14 になるとすぐに、1 回実行されて保釈されます。

于 2009-04-28T22:50:03.043 に答える