2017-02-28 5 views
-1

私はこのコードを書いて、かなりうまく動作している配列内の要素を見つけましたが、100%の動作は分かりません。私の質問は、それが0から9までしか動かない場合、どのように(j == nElems)来るのでしょうか?また、条件が検索キーが見つからないときにforループの外側で満たされていることに気付きました。この条件が満たされるのはなぜですか? (j == nElems)

public class ArrayApp { 
    public static void main(String args[]) { 
     int nElems = 10; 
     int[] arr = new int[nElems]; 
     int j; 
     int searchKey; 
     arr[0] = 77; 
     arr[1] = 99; 
     arr[2] = 44; 
     arr[3] = 55; 
     arr[4] = 22; 
     arr[5] = 88; 
     arr[6] = 11; 
     arr[7] = 00; 
     arr[8] = 66; 
     arr[9] = 33; 
     for (j = 0; j < nElems; j++) { 
      System.out.print(arr[j] + " "); 
     } 
     System.out.println(); 
     //Find 66 in array 
     searchKey = 66; 
     for (j = 0; j < nElems; j++) { 
      if (arr[j] == searchKey) { 
       break; 
      } 
     } 
     if (j == nElems) { 
      System.out.println("Cant find " + searchKey); 
     } else { 
      System.out.println("Found " + searchKey + " in position " + j); 
     } 
     //Remove 55 from array 
     searchKey = 55; // delete item with key 55 
     for (j = 0; j < nElems; j++) { // look for it 
      if (arr[j] == searchKey) { 
       break; 
      } 
     } 
     for (int k = j; k < nElems - 1; k++) { // move higher ones down 
      arr[k] = arr[k + 1]; 
     } 
     nElems--; 
     for (j = 0; j < nElems; j++) { 
      System.out.print(arr[j] + " "); 
     } 
    } 
} 
+0

アプリをデバッグしていない理由はありますか? – liorsolomon

答えて

0
for (j = 0; j < nElems; j++) { 
    if (arr[j] == searchKey) { 
     break; 
    } 
} 

nElemsはjはその時点で10に到達するまで< nElemsが満足される10だから、jは、それがループを終了します。しかし、その点に達するのは、

arr[j] == searchKey 

(つまり、検索キーが見つからない場合)です。だからあなたが見ているのは、検索キーが決して見つからない、jが10までインクリメントされ、その時点でループが終了するということです。この時点で、j == nElems。

for (j = 0; j < nElems; j++) { 
    if (arr[j] == searchKey) { 
     break; 
    } 
} 

HereのOracleのドキュメントを約forループは言う:

0

各繰り返しの最後に、jがインクリメントされます。その後、停止条件がテストされます。その条件が真であれば、ループは終了する。それ以外の場合は、新しい値jが続行されます。

これは、forループがj < nElemsまで実行されることを意味します。 j == nElemsになると、forループが実行されます。したがって、最後にjは必ずnElemsに等しくなければなりません。そうでなければ、ループは決して終了しません。

1

さんがあなたのforループを見てみましょう

インクリメント式が ループを通る各反復の後に呼び出されます。この式が増分するか、または の値を減分することは完全に許容できます。

したがって、上記のループでは、各繰り返しの後にjがインクリメントされます。 2回目の最後の反復では、jは​​になります。それはループを実行し、jをインクリメントし、nElemsと等しくなります。

if等の条件は、時間制御は、それに到達することにより、jは既にnElemsに等しくなり、従って、それはtrueになり、ループの後に配置されています。

int j = 0; 
int nElems = 10; 
while(j < nElems) { 
    if(arr[j] == searchKey) { 
     break; 
    } 
    j++; 
} 

あなたはjがあるときに、最終的な条件があろうと見ることができます。

1

私たちは、基本的に次のように破壊するものを、このforループforループ

for (j = 0; j < nElems; j++) { 
    if (arr[j] == searchKey) { 
     break; 
    } 
} 

ザ・を意味簡素化を試みることができます10(nElems)に相当します。

関連する問題