2014-04-30 23 views
2

我會通過一些練習,但我很困惑在這一個:前/後遞增/遞減和運營秩序混亂

public static int f (int x, int y) { 
    int b=y--; 
    while (b>0) { 
    if (x%2!=0) { 
     --x; 
     y=y-2; 
    } 
    else { 
     x=x/2; 
     b=b-x-1; 
    } 
    } 
    return x+y; 
} 

什麼是b=y--的目的是什麼? 那麼,例如,x=5y=5 當我們第一次進入while循環(while (b>0))將b = 4或5?當我運行我的電腦b中的代碼是5.並且回報是3.這對我來說真的不清楚。對不起,如果我不清楚我的問題。

+3

閱讀有關運算符優先級和前/後加/減運算符。 –

+0

在調試器中跟蹤代碼可能會非常有用,因爲您可以在每個步驟檢查每個變量。 – alk

回答

5

int b=y--;第一assignes b=y然後遞減yy--)。

也看看prefix/postfix unary increment operator

這個例子(從鏈接頁面獲取)演示了:

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

在分配b後將y遞減1。 –

+0

@ La-comadreja謝謝!固定。 – Sebastian

1

我相信B將等於5進入循環,因爲

b=y--; 

當 「 - 」 是可變的背後它在行動後遞減。

1

這是糟糕的編碼,因爲它可能會混淆新的程序員。

函數假設它正在傳遞值(如上例所示)(與傳遞引用相反)需要y的副本,將其遞減並將其分配給b。它在調用時不會改變傳遞給函數的參數。

+2

或者,這也許是一種旨在混淆新程序員讓他們真正思考和理解前後增量/減量運算符的練習? – indivisible

+1

爲其糟糕的編碼。這是,並沒有任何理由 –

+0

@ MBS可能是真實的。雖然從這個唯一的教訓是,不要使用前綴。只使用自己的postfix –

3

後遞增/遞減與預遞增/遞減之間的差異在evaluation of the expression中。

預增量和預減量運算符將它們的操作數遞增(或遞減)1,並且表達式的值是結果遞增(或遞減)的值。相反,後增量和後減量操作符將其操作數的值增加(或減少)1,但表達式的值是操作數在增量(或減量)操作之前的原始值。

換句話說:

int a = 5; 
int b; 
b = --a; // the value of the expression --a is a-1. b is now 4, as is a. 
b = a--; // the value of the expression a-- is a. b is still 4, but a is 3. 

請記住,程序必須計算表達式做一切。一切都是一種表達,即使只是偶爾提到一個變量。以下所有的表達式:

  • a
  • a-1
  • --a && ++a
  • System.out.println(a)

當然,在表達式求值,operator precedence規定的表達式一樣的值您在小學時學到的PEMDAS。一些運算符(如增加/減少)具有副作用,這當然非常有趣,也是創建函數式編程的原因之一。