2017-02-14 5 views
10

このポストインクリメント方程式がなぜ増加しないのか理解できません。私は、+ =演算の後に値が1ずつ増加し、次にiの周りの2回目に1の値があると考えていたでしょう。しかし、出力は0の無限ループです。誰もがなぜ私は増加しないのか説明することができますか?ポストインクリメント無限ループi + = i ++;

int i = 0; 
for(; ;) { 
    if (i >= 10) break; 
    i += i++; 
} 
System.out.println(i); 
+1

注釈は、ポストインクリメントが定義されているか、+ =演算子がどのように動作するかによって発生します。 JSでは、おそらく他の言語でも同じ動作が観察されます。 – njzk2

+0

* Java Puzzlers *には、[* Inclement Increment *](http://cs.fit.edu/~ryan/cse4051/java-puzzlers/4-loopy-puzzlers/puzzle-25/Increment)と呼ばれる、ややトリッキーなパズルがあります。 -java.html)。 – shmosel

+0

JavaとC#では、無限ループを出力します。しかしC言語では次のように出力されます: 'i + = ++ i;'言語から言語への変更。 –

答えて

6

@ njzk2からの答えが正しいですが、なぜそれが正しいことを指摘するのに便利です。

他の可能性があります。たとえば、割り当て後にJavaがポストインクリメント演算子を実行しないのはなぜですか? (回答:これはJava言語デザイナーが選択したものではないため)

複合語割り当ての評価順序(+=など)は、Java言語仕様のセクション15.26.2で指定されています。私はhow it is defined for Java 8を引用します:

  • まず、左側のオペランドは、変数を生成するために評価されます。この評価が突然完了すると、同じ理由で割り当て式 が突然完了します。右側のオペランドは ではなく、代入は行われません。

  • それ以外の場合は、左側のオペランドの値が保存され、次に右側のオペランドが評価されます。この評価が を突然終了した場合、同じ理由で の代入式が突然完了し、割り当てが行われません。

    それ以外の場合は、左辺変数の保存値と右辺オペランドの値を使用して、複合割り当て演算子で示されるバイナリ演算 を実行します。この操作 が突然完了すると、同じ理由で代入式が突然完了します(代入式は )。

  • は、そうでない場合、バイナリ演算の結果は、適切な標準値のセット(ない 拡張指数に値設定変換 (§5.1.13)に付し、左側の変数の型に変換され値の集合)、変換の結果は が変数に格納されます。

最も重要なことは、左手式の値が最初に保存されていることを、右の手は完全に評価され、その後、複合操作の結果は左側に変数に格納され手の側。

+0

正解ですが無意味です。これは、UBが完全に正当化されているケースの1つです。 – KevinZ

+0

@KevinZ Cの未定義の振る舞い(UB)を指していると思いますが、私はあなたの声明にはJavaに関しては同意しません。 Javaの哲学は、可能な限りクロスプラットフォームとすることです。 Javaでは完全に定義されていない動作はありませんが、仕様の範囲内でプラットフォームによって異なる動作があります。 C/C++の設計理念は異なります。 –

22

のはi += i++;

i++手段はiをインクリメントし、その後、iの値を読んで調べてみましょう。

i += xは、iを評価し、xを評価し、2を加算して結果をiとします。

だから、何が起こることです:

  • i

    が評価されます、それは0
  • i++が評価されますです。 0を返し、iの値を1
  • i += i++に設定します。現在はi = 0 + 0です。
  • i = 0

その値を読む前に、インクリメントの結果を得るために++iで試してみてください。

1

あなたが無限ループになってきていない驚きが...

class Demo{ 
    public static void main(String[] args){ 
    int i = 0; 
    for(; ;) { 
     if (i >= 10) 
      break; 
     i = i+i++; 
     System.out.println(i); 
    } 
    } 
} 

は、上記のコードを仮定し、私は、コンパイラが代わりになるかと増分を使用してラインを交換しました。

ここで、最初はi = 0、 + 0 I = 0 //で ので

i = i+i++ 

結果と今私は1

ですが、最後にもう一度、私は0に等しい作ります!したがって、無限

...

関連する問題