AndroidスタジオでAndroidアプリを開発するときに、whileループ内で使用される変数の値が正しくありません。Android:whileループで変数の値が正しくない
- は、Android Studioで新しいプロジェクトを作成し、空白の活動
- 主な活動へ
メソッドONSTARTを次のコードを追加します:私は非常に単純なケースにテストケースでそれを減少
@Override
public void onStart() {
super.onStart();
int count = 2;
int index = 1;
int value = 23;
Log.i("test", "value before = " + value);
while (index < count) {
Log.i("test", "value in while loop = " + value);
index++;
value = 0;
}
}
出力テストアプリケーションを実行している:
value before = 23
value in while loop = 0
結果が
value in while loop = 23
デバッグする必要がありながら、予想通り、結果は(「= 23 whileループ内の値」)ですが、通常のデバッグビルドでは、それは間違っています。主なアクティビティクラスの逆アセンブルされたコードはOKです。変数 'value'の値は、whileループ本体の最後で0に設定されています。 whileループ本体内のあるコードまたは関数が変数 'value'を使用すると、23ではなく0になります。テストケースでは、Logステートメントを使用して簡略化します。
私は
if (value == 23) {
value = 0;
}
または私は
value = 0;
行を削除するときに、それはいくつかの最適化のエラーのように見えるにライン
value = 0;
を変更したときにそれは間違って行きません。しかし、これを引き起こす可能性のある最適化は何ですか?それはコードを信頼できないものにします。
本当にあなたの特定のJavaバージョンと最も重要なJVMに依存します。しかし、はい、Javaは最適化を行い、JVMはランタイムの最適化を行い、ループアンローリングは最適化の対象となります。たとえば、ここをクリックしてください:[Java JIT loop unrolling policy?](http:// stackoverflow。com/questions/7243221/java-jit-loop-unrolling-policy)を参照してください。 – paulsm4
サムスンですか? – zapl
実際に何かの値を使用すると、オプティマイザは値を変更しないように見えます。ログステートメントがカウントしていないように見えることを忘れないでください。 – mjstam