2012-11-03 97 views
0

有人能解釋爲什麼這代碼的輸出是前綴和後綴增量,同時比較變量

not equals 
not equals 2 
第一

if語句似乎A = 0 B/C是一個後綴增量;因此下一行不會增加;然而,這兩個a不相等爲什麼?而在第二種情況下,如果我運行調試器時a的值是2,但測試是錯誤的,爲什麼?

public static void main (String[] args) 
    { 
     int a = 0; 
     if (a++ == a++) { 
      System.out.println("equals"); 
     } else { 
      System.out.println("not equals"); 
     } 

     if (++a == 2) { 
      System.out.println("equals 2"); 
     } else { 
      System.out.println("not equals 2"); 
     } 

    } 
+0

可能重複[爲什麼JAVA語句評估正在發生這樣的?](http://stackoverflow.com/questions/12036481/why-java-statement-evaluation-is-occurrence-like-these) – raina77ow

+1

ahh,沒關係..在第一個如果a增加兩次,所以是0 == 1;那麼a在下一行再次遞增,所以a現在是2.在第二個如果先增加並且稍後比較,那麼a是3和3!= 2;因此,答案:不等於,不等於2 – miatech

+1

這是完全重複的,已經[**回答**](http://stackoverflow.com/a/12036576/1229023)非常好的細節(帶鏈接包括文檔)。爲什麼你沒有使用搜索,我想知道? – raina77ow

回答

0

a ++(後增量)將增加第一個值,然後將其賦值給變量。在你的第一種情況下

(a ++ == a ++)在第一次增量中,一個值首先增加1,但尚未分配,但是當它到達第二個a ++時,現在分配了一個值並且正在遞增它再次。

例如

if say a=0; 

(a++==a++) would be (0==1) 

所以現在的一個值將評估if之後是2。

你的第二個案例

(++a==2) here a would be incremented to 3 , (3==2) which is false thus the else if executed 
0

編輯:剛剛意識到你還要求第一不等於,這只是回答了第二個呢。

由於

  • a已經2(已經遞增兩次)
  • ++a3所以
  • 3 == 2false因爲前綴評價之前施加。
1

這並不是說這裏等到下一行。 ==是一個'邏輯'運算符,因此每一邊的表達式首先被評估,其中每一個都有增加'a'值的副作用。在LHS上使用第一個增量的結果,在RHS上使用第二個增量的結果。

在這種情況下,重要的不是操作者是否爲「前綴」或「後綴」

+0

那麼,實際上在做'(1 == 2)'還是'(0 == 1)''?(a ++ == a ++)? –

+0

(1 == 0),然後在你的第二種情況下(3 == 2)。 – robert

+0

'int a = 0; \t \t System.out.println(a ++ == 0);'輸出true。 :) –