2012-05-30 29 views
3
int i=9; 
System.out.println(--i + ++i); 

上執行的輸出:17
I的最終值是:9輸出在(--i + ++ⅰ)在Java

但根據結合性和優先級規則在Java中,, ++我應該首先執行,即從右到左,它給出10然後--i給出9 ..添加兩個,答案應該是19 ...就我所知這樣的代碼在C/C++中給出未定義的行爲,但在java中,規則是嚴格定義的,並且沒有序列點的概念。所以,任何人都可以澄清這個問題,因爲我真的很困惑這個?同樣在一些書中提到後增量和後減量運算符是LTR關聯。但在其他一些書中,它的所有遞增和遞減(post和pre)都是RTL關聯.. !!任何人都可以給java一個正確的運算符優先級和關聯性表嗎?

+0

的可能重複[++ 1 + + +我+ + +我在Java vs C](http://stackoverflow.com/questions/3879176/iii-in-java-vs-c)和特別是[這個答案](http://stackoverflow.com/a/3879280/829571) 。 – assylias

回答

1

第一--i變爲8,然後++ i變爲9.so answr是17

int i =9; 

--i =8, now i is 8 
++i=9 ,++ makes 9 

so finally (8+9)=17 and i=9. 
9

你能指出其中的Java語言規範它說,關聯從右到-剩下?它不是,它是從左到右(除了多個分配 - 例如x = y = 4)。請參見JLS部分15.7.1,標題爲「首先評估左手操作數」。因此,答案是正確的:

--i + ++i 

首先--i進行評估。這減少i(現在是8)並返回後減量值(8)。然後將其添加到++i,這相當於遞增和遞增(因此RHS評估爲9)。

你會想到這是評估R-L同時,它類似於

AtomicInteger i = new AtomicInteger(9); 
i.decrementAndGet() + i.incrementAndGet(); 

+2

增加直接JLS引用。 –

+0

他可能會混淆infix +和pre-increment ++的關聯性。這本書(http://introcs.cs.princeton.edu/java/11precedence/)說前增量++是從右到左的。 – nhahtdh

+0

非常感謝Louis! –

2

表達式求值變爲由左到右

(--i + ++i) 

--i = 8 //i becames 8 here 
++i = 9 // i becames 9 here again 
8+9 = 17 
0

輸出是正確的:

首先,--i首先執行,所以i變爲8然後執行++i。現在,i8所以++我變成9,然後中間+它變成8 + 9 = 17

Java從左到右依從關聯性。

0

(--i + ++ⅰ)

評價開始從左到右。

first (
second --i // 8 
third + // addition operator 
fourth ++i // 9 
fifth ) 

8 + 9 = 17 
0

int i=9; System.out.println(--i + ++i);

,因爲我們知道,遞增和遞減的優先級比算術運算符「+」高,所以「+」和「 - 」首先評估。現在一元運算符的結合性是從右到左的,所以根據它,它應該首先評估'++'運算符。但是在評估之前,還有另一個綁定的概念,所以它會綁定表達式爲 ((--i)+(++i)),現在根據()運算符(它的關聯性是從左到右),它將首先評估(--i),然後評估(8+ (++i))i=8。 現在它會評估(++ i)然後(8+9)i=9,最後回答將 是(8+9) = 17

1

評估從左到右開始。做--i成爲8和++i計算結果爲9和另外做這給17

+0

這已經得到了答覆和解釋,那麼你打算再次這樣做? – Tom

-1

表達式求值變爲由左到右

i=9; 
First --i than i=9-1, i=8 
After ++i than i=8+1, i=9 
--i + ++i = 17 
+0

這已經得到了答覆和解釋,那麼你打算再次這樣做? – Tom

+0

沒有任何具體的意圖,只是給答... –