3

これがコードです-

int i = 0;
    
System.out.printf( "\n%d\n\n", i );  // show variable i before loop
    
for( i = 0; i < 8; i++ )
{
    System.out.printf( "%d\t", i );
}
    
System.out.printf( "\n\n%d\n", i );   // show variable i after loop

これが出力です-

0

0 1 2 3 4 5 6 7

8

私の問題は、forループの終了後に変数iを使用したいときに発生します。私は7を読んでいると思いますが、ゼロベースのカウントでは8番目の増分ですが、実際には8として読み取られます!!! ループの終了時に、変数iがもう1つインクリメントされました。

これを修正するには、ループの最後で、それ以降のコードで使用する前に、iのようなことを行う必要があります。これは、コードを理解しにくくするように私には思えます。

より良い解決策はありますか?

4

7 に答える 7

13

が7の場合でもi条件i < 8は満たされているため、ループを終了する理由はありません。

ループの前にループ変数を宣言し、とにかく後でそれを使用することはあまり明確ではありません。むしろ、loopステートメントを使用してループ変数を宣言することを検討してください。

int numIterations = 8;
for(int i = 0; i < numIterations; i++) {
    // ...

}
// continue doing something with numIterations, or numIterations-1

numIterations-1本当に気になる場合は、代わりにループ不変条件として使用して使用することもできますint maxCounter = 7i <= maxCounter

于 2012-11-08T13:35:02.357 に答える
3

あなたが言う時

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

真ん中の部分、i < 8ループ不変条件です。それが成り立つ限り、次の反復があります。したがって、ループを離れると、不変条件が保持されなくなりiおそらく8未満になることはないためです。

于 2012-11-08T13:35:44.473 に答える
2

読みやすいものが必要な場合は、次のようにします。

int start = 0;
int end = 7;
System.out.printf( "\n%d\n\n", start );  

for(int i = start; i <= end; i++ )
{
    System.out.printf( "%d\t", i );
}

System.out.printf( "\n\n%d\n", end );   
于 2012-11-08T13:36:46.810 に答える
2

i == 8ループ条件が次のようになっているため、ループは次の場合に終了しますi < 8。または、別の言い方をすれば、次の場合は反復を停止しますi >= 8

したがって、ループ内の最後i++はに割り当て8られi、ループを終了します。それはあなたが得ている結果を説明します、そしてそれらは期待通りです。おそらくi++、ループを終了する前に最後が実行されないと誤って想定していました。

必要な動作を取得するには、代わりにこれを試してください-コードの意図はより明確です:

int i = 0;
int iterations = 8;
System.out.printf( "\n%d\n\n", i );
while (i < iterations) {
    System.out.printf( "%d\t", i );
    i++;
}
System.out.printf( "\n\n%d\n", --i );
于 2012-11-08T13:37:40.927 に答える
1

それは正しいです、さもなければそれは決して終了しません7 < 8

もちろん、このコードでは、ループの最後で変数が常に同じになることがすでにわかっているため、ロジックを追加することはできません。条件文を含むより複雑なコードでそれが必要だと思うので、その場合はこれを行うことができます:

int i = 0;

System.out.printf( "\n%d\n\n", i );  // show variable i before loop

for( i = 0; i < 8; i++ )
{
    if ( i == 3 )  // just for example
        break;
    System.out.printf( "%d\t", i );
}

System.out.printf( "\n\n%d\n", i );   // show variable i after loop

これは印刷されます:

0

0 1 2 3

3
于 2012-11-08T13:39:54.587 に答える
1

操作の順序を知っていれば、これは本当に簡単です

  • STEP_1-身体手術前の行動。
  • SETP_2-trueの場合に操作を続行する論理式を評価します。
  • STEP_3-ボディ操作を実行します。
  • STEP_4-ボディ操作後のアクション。

それで:

for(STEP_1; STEP_2; STEP_4) {
    STEP_3
}

通常、ステップ1で変数を初期化し、ステップ4で次のループ評価のために変数を変更します。

int i = 0;

for(; i< 8; i++) {

}

i == 8ループの前に宣言されているように、値がとどまると、ループは中断します。

于 2012-11-08T13:47:17.547 に答える
0

ループでは、変数iは8以上になるまでインクリメントされ、その時点で条件がトリガーされてループが終了します。

これはまさにそれが機能する方法です。

ですから、私が考えることができる2つのオプションがあります。

ループの後、変数iから1を引きます。

ループにifステートメントを入れて、iが7に等しいときにブレークするようにします。

for (i = 0; i < 8; i++) {
  if (i == 7) break;
}

別のオプションは、次のようにdowhileを使用することです。

i = -1;
do {
  i++;    // increment i so that it is at the correct current value starting with zero
  // loop stuff
} while (i < 7);
于 2012-11-08T13:38:00.210 に答える