2016-09-03 12 views
0

++をして、私は、コードの一部でも動作しますなぜ取得に問題が午前:のJava:トラブル私は

private int m; 
private int n; 

public void f() { 
    m = (m +2) % n; 
    System.out.print(m+"\n"); 
} 

public void g() { 
    int i=0; 
    m=0; 
    n=8; 
    while (i++<n) { 
     System.out.print("i=" + i + " m="); 
     f(); 
    } 
} 

私はg()を実行した場合、私は、次のプリントアウトを取得:私として

i++=1 m=2 
i++=2 m=4 
i++=3 m=6 
i++=4 m=0 
i++=5 m=2 
i++=6 m=4 
i++=7 m=6 
i++=8 m=0 

をそれを理解して、最後の行は現れてはいけません。なぜf()は前回の取得ですか?

f()が初めて呼び出されると、i = 0とそこにはi++ = 1があります。 (したがって、iを印刷すると、それはすでに1に等しい)。

私がf()を最後に2回呼び出すと、i = 6、そしてi++ = 7があります。これは最後の全体で、< nn = 8)です。

なぜi++が既に= 8になっているときに、関数が再び呼び出されるのですか?これは本当に私を混乱させる。

+1

あなたは 'i ++'と '++ i'の違いを知っていますか?そうでない場合は、そのコードを調べて、コードがそのように機能する理由を知ってください。 – Tom

+0

このような出力をどのように受け取ることができますか?再現できません! – xenteros

+0

@xenteros http://ideone.com/jr9QDr – Tom

答えて

2

++i代わりのi++を試してみてください。

これはその事実に関係しています:「インクリメントiおよび処理するために、次のオペレータに結果の数を返す」

  • ++i手段(PRE-インクリメント)
  • i++は、「次の動作にiの値を返し、そうAFTER iをインクリメント」を意味します。私は++ポストインクリメントであるため、(ポストインクリメント)
+0

多くのコーディングスタイルでは、混乱を招くので、ステートメント内で '++'を使うのは悪い習慣です。 (注目すべき例外は 'array [i ++]'を使って配列の繰り返しになるかもしれません) –

+0

ええ、私は増分を混合して比較するファンでもありません。特に括弧がその違いを覆い隠す場合(i ++が括弧内にあれば、OPは気づかなかったでしょう)。私はなぜC言語のような言語がこれを持っているのかを知ることができます。 –

2

です。これは、nと比較した後にインクリメントされることを意味します。あなたが持っているときのn

2

と比較する前に、私をインクリメントしたい場合は、++、私を使用する必要があります:あなたが持っているかのよう

while(i++<n){ 
... 
} 

をそれはです:

while(i<n){ 
i++; 
... 
} 

値が最初に取得します使用され、次に増分される。

あなたは値が最初にインクリメントして、条件の評価に使用したい場合、あなたはこの使用します。これは、しばらくして、だけでなく、場合だけではなく真実であることを

while(++i<n){ 
... 
} 

は注意を、 、for-do-while、および他のインラインでの変数の評価。

+0

違いは何ですか? – Punga

3

利用++iの代わりi++

  • 私は++、コピーを作り増加I、およびコピーを返しますので、 I(ポストインクリメント)の古い値を返します。

  • ++ iはiを増やし、i(更新前の値)を返します。

ですから、条件i++<nそれは古い値でチェックされているので、条件がtrueと評価されたを確認したとき。

関連する問題