2012-03-26 75 views
3

的下面是輸出6一個例子:優先級一元操作

public static void main(String[] args) { 
    int i = 1; 
    m(++i); 
} 

static void m(int i) { 
    i = ++i + i++; 
    System.out.println(i); 
} 

我們得到6因爲在第一33m(int i)方法進行了總結,然後i成爲4(由於i++)但在此之後i從左邊部分取總結6值。

但是,如果方法改變爲如下,我們得到7

static void m(int i) { 
    i = ++i + ++i; 
    System.out.println(i); 
} 

但我希望看到7在這兩種情況下(我已經被事實指導,即一元操作,在這種情況下,遞增,具有比二元操作更高的優先級)。有人能否提供第一個例子中被忽略的i++的解釋(或參考解釋)?

+0

遞增運算符從左到右運行,'i ++'返回遞增前的結果,即i。即++我讓我6,然後我+我得到計算,然後我++增加了另一次。 – mihi 2012-03-26 16:58:45

+0

'i ++ + ++ i'會向你顯示2 + 4 = 6,並且'i ++ + i ++'是2 + 3 = 5 – mihi 2012-03-26 17:00:11

+0

最後但並非最不重要的'i = i ++'沒有效果,因爲它會在遞增之前分配值回到我:) – mihi 2012-03-26 17:01:05

回答

4

++i增量i並返回i

i++增量i並返回i

表達式從左到右進行評估,考慮到運算符優先級。

所以在++i + i++,當你開始i == 2,您可以:++i這遞增i3並返回3;然後i++,其增量爲i4並返回3。然後最後你有i = 3 + 3所以i變成6

請注意,這些技巧與真實世界的編程無關。

+0

謝謝,在現實世界的編程中沒有這種情況是有希望的。 – 2012-03-26 17:11:10

+0

我不完全同意你的最後一段。 「++ i + i ++」之類的奇怪現象與現實世界的編程無關,但OP似乎並不知道'++ i'和'i ++'之間的區別,而* that * difference * is * relevant到現實世界的編程。 – ruakh 2012-03-26 17:39:54

+0

@ruakh的確,「++ i」和「i ++」之間的區別當然很重要。我的意思是,你絕對不應該在真實軟件中編寫棘手,難以理解的語句,比如'i = ++ i + i ++'。 – Jesper 2012-03-26 19:28:38

1

增量不被忽略;它是一個後增量運營商(即它在i被引用後應用)。我們來看看代碼。

當您添加(++i + i++)時,它從左到右完成。這就是說,無論我擁有的價值是先預先增加(所以它需要2到3),然後加上2. i已完成其參考,因此它會增加另一個1,總共爲6,

在你的第二個例子,當你添加(++i + ++i)時,i的值預先增加了兩次,所以你會看到3 + 4

+0

我編輯了你的答案,將「postfix」改爲「postincrement」,我認爲這是你的意思;但後來我解開了我的編輯,因爲這真的取決於你。但我認爲你想要「後增量」。 (「Postfix」只與它的物理位置有關,而不是當它被應用時。) – ruakh 2012-03-26 17:06:30

+0

我很好,我很高興你抓到了。這正是我的意思。謝謝! – Makoto 2012-03-26 17:10:44

2

有人能否提供第一個例子中被忽略的i++的解釋(或參考解釋)?

i++是後增量;它會遞增i,但會從增量之前的值計算出i。因此,舉例來說:

int i = 3; 
System.out.println(i++); // prints 3 
// now, i == 4 

換句話說,你能想到的i++的意思((i += 1) - 1)。所以,在你的榜樣:

i = ++i + i++; 

i++末是不完全忽視 —它確實增加i —但立即得到由賦值來取代。