2011-03-24 164 views
25

從下面的程序或here,爲什麼上次撥打System.out.println(i)打印價值7Java:增量/減量運算符的前綴/後綴?

class PrePostDemo { 
    public static void main(String[] args){ 
      int i = 3; 
      i++; 
      System.out.println(i); // "4" 
      ++i;    
      System.out.println(i); // "5" 
      System.out.println(++i); // "6" 
      System.out.println(i++); // "6" 
      System.out.println(i); // "7" 
    } 
} 
+6

我相信我多少有些瞭解您的誤解來自於。你認爲只有當它是一個聲明時,一個新值纔會被分配給'i'?將參數傳遞給函數時,語句(在本例中爲post和前綴)在傳遞它們之前執行。如下面的答案中所述,添加postfix和prefix之間的行爲差​​異,並理解爲什麼您會得到該輸出。 – 2011-03-24 01:22:39

+0

[x = x ++「之後的x是什麼?](http://stackoverflow.com/questions/7911776/what-is-x-after-xx) – nawfal 2014-07-20 08:56:27

+0

http://stackoverflow.com/a/ 30480534/4533771 – dnuka 2015-06-16 02:00:39

回答

54
i = 5; 
System.out.println(++i); //6 

這種打印出「6」,因爲它需要我增加了一個它和返回值。 5 + 1 = 6;這是前綴,在操作中使用它之前添加到數字中。

i = 6; 
System.out.println(i++); //6 (i = 7, prints 6) 

這打印出「6」,因爲它需要我,存儲副本,加1並返回副本。所以你得到了我的價值,同時也增加了它的價值。因此,你打印出舊值,但它會增加。後綴增量的美觀。

然後當你打印出我時,它顯示了我的實際價值,因爲它已經增加了。 7

+1

在這裏所有其他的答案說,「我」的價值將首先使用,然後它會增加,但正如你所說的是正確的,價值增加,然後返回舊值的複製。當我們以i = 5; i = i ++;爲例時,我們理解更多;如果這個值先被賦值然後遞增,那麼我會是6,但在這種情況下是5 – Saumyaraj 2016-07-15 18:34:23

2
System.out.println(i++); // "6" 

這發出println我有這行代碼之前的值(6),然後遞增I(〜7)。

2

爲什麼變量沒有被更新?

  • 後綴:將i的當前值傳遞給函數,然後遞增它。
  • 前綴:遞增當前值,然後將其傳遞給函數。

你不會做任何事的行我沒有區別。

注意,這也是功課true:

i = 0; 
test = ++i; // 1 
test2 = i++; // 1 
0

考慮一下臨時變量吧。

i =3 ; 
i ++ ; // is equivalent to: temp = i++; and so , temp = 3 and then "i" will increment and become  i = 4; 
System.out.println(i); // will print 4 

現在,

i=3; 
System.out.println(i++); 

相當於++ii++類似於i = i+1.雖然它不盡相同

temp = i++; // temp will assume value of current "i", after which "i" will increment and become i= 4 
System.out.println(temp); //we're printing temp and not "i" 
3

思考。不同的是,實際上i將被分配新的增量。

in ++i,增量立即發生。

但是如果i++在程序轉到下一行時會出現增量。

看看這裏的代碼。

int i = 0; 
while(i < 10){ 
    System.out.println(i); 
    i = increment(i); 
} 

private int increment(i){ 
    return i++; 
} 

這將導致非無限循環。因爲我將以原始值返回,在分號後我會增加,但返回的值沒有。因此,我永遠不會實際返回作爲遞增值。

9

我知道這已被回答,但認爲另一種解釋可能會有所幫助。

另一種方式來說明它是:

++i會給new i的結果,i++會給原來i的結果和存儲new i下一個動作。

想一想的方法是,在表達式中做其他事情。在打印當前值i時,它將取決於i是在表達式內還是在表達式之後被更改。

int i = 1; 
result i = ++i * 2 // result = 4, i = 2 

i在計算結果之前進行評估(更改)。對此表達式打印i顯示用於該表達式的改變的值i

result i = i++ * 2 // result = 2, i = 2 

i在計算結果後進行評估。因此,從該表達式中打印i給出了在該表達式中使用的原始值i,但i仍然爲了任何進一步的用途而改變。因此,在表達式之後立即打印i的值,將顯示新增值i。由於i的值已更改,無論是打印還是使用。

result i = i++ * 2 // result = 2, i = 2 
System.out.println(i); // 2 

如果你保持一致的模式,包括所有的值打印線:

int i = 3; 
System.out.println(i); // 3 
System.out.println(i++); // 3 
System.out.println(i); // "4" 
System.out.println(++i); // 5   
System.out.println(i); // "5" 
System.out.println(++i); // "6" 
System.out.println(i++); // "6" 
System.out.println(i); // "7" 
+2

我希望這個答案可以幫助有人用java掙扎,因爲我一直在掙扎。歡呼聲 – 2013-11-18 06:33:58

0

也許你能理解這個例子更好的前綴/後綴。

public class TestPrefixPostFix 
{ 
    public static void main (String[] args) 
    { 
     int x=10; 
     System.out.println((x++ % 2 == 0)?"yes "+ x: " no "+x); 
     x=10; 
     System.out.println((++x % 2 == 0)?"yes "+ x: " no "+x); 
    } 
}  
0

這是我的答案。有些人可能會覺得很容易理解。

package package02; 

public class C11PostfixAndPrefix { 

    public static void main(String[] args) { 
     // In this program, we will use the value of x for understanding prefix 
     // and the value of y for understaning postfix. 
     // Let's see how it works. 

     int x = 5; 
     int y = 5; 

     Line 13: System.out.println(++x); // 6 This is prefixing. 1 is added before x is used. 
     Line 14: System.out.println(y++); // 5 This is postfixing. y is used first and 1 is added. 

     System.out.println("---------- just for differentiating"); 

     System.out.println(x); // 6 In prefixing, the value is same as before {See line 13} 
     System.out.println(y); // 6 In postfixing, the value increases by 1 {See line 14} 

     // Conclusion: In prefixing (++x), the value of x gets increased first and the used 
     // in an operation. While, in postfixing (y++), the value is used first and changed by 
     // adding the number. 
    } 
} 
1

它打印最後聲明,在上面的語句COS,它的價值是,它的遞增至7時,最後一個語句會打印

+0

提問者有代碼,請用代碼解釋你的答案 – Ibo 2018-02-12 20:38:04

相關問題