2016-10-29 46 views
-2
int number; 
number = 80; 

number = (int)math.sqrt(number++) 
System.out.println(number) 

這就是上面的代碼。我是編程新手,在數學領域有着不錯的表現。有人可以解釋這個數字= 80; number =(int)math.sqrt(number ++);數字= 8?

我知道SQRT爲8。然而,在這種情況下,我很困惑,爲什麼答案不是9

我知道++ VAR和VAR ++以及如何它可以影響答案但是考慮到PLUS位於打印代碼的上方,我很困惑爲什麼一個沒有添加到八,然後打印數字9。

+0

'8.944 ...'在轉換爲'int'時變成了'8'。這與使用'println()'實際打印無關。你將這個值保存在變量'number'中,**然後**遞增它。增量永遠不會保存到'number'。 – Gendarme

+0

你好,它的喬,謝謝你幫我理解這個概念。 regaurds,joe – JAVAJoseph

回答

1

number++後增量,表示在平方根函數內將表達式評估爲80。

80平方根嚴格小於9,從而其整型轉換(與(int)完成)爲8。

+1

你好,非常感謝你的回覆。謝謝Joe – JAVAJoseph

1
number = (int)math.sqrt(number++) , 

這裏首先表達式進行求值,則數增加,這就是爲什麼。

如果將其更改爲

number = (int)math.sqrt(++number) , 

那麼它會工作通過指定整個表達式的結果返回

+0

你好,非常感謝你的回覆。這是一個讓我在我的Uni課程過去的論文中感到困惑的答案。所以我主要關心的是爲什麼我得到了我所做的結果而不是修復腳本。不過,非常感謝您的回覆joe – JAVAJoseph

3

更新++使得以number在賦值的右邊的操作數將被覆蓋到number

這覆蓋了JLS§15.26.1。下面是在賦值表達式會發生什麼:

  1. 的左側被確定爲一個變量
  2. 賦值表達式的右邊進行評估:
    1. 80讀從number
    2. number遞增到81(這並不重要)
    3. math.sqrt時調用值80讀取波夫
    4. math.sqrt結果被轉換爲int
  3. 結果從上述#2(8)被存儲在number

注步驟2.1的順序和上面2.2。那是因爲你使用了後綴number++。如果您使用++number,訂單將會被顛倒(結果不同)。

++ on number在右側對錶達式的結果沒有任何影響。 (在Java中,在其他一些語言中,這會被認爲是未定義的行爲,允許編譯器做任何想做的事情。)

尤其是(因爲您提到期望得到值9),不會在分配結果存儲在number中後應用。在將其傳遞到math.sqrt時,讀取值number後立即應用。

+0

夢幻般的答案! –

+0

簡而言之,副作用是「i ++」評估的一個組成部分。只要您使用表達式的結果,副作用就已經應用了。 –

+0

你好,非常感謝你的不可思議的信息答案。謝謝,喬 – JAVAJoseph

0

在java中,後增量影響表達式計算時的變量,而不是語句運行後。所以變量增加到81,先前的值80被傳遞給sqrt,最後被賦值爲8.

+0

你好,非常感謝你的回覆。謝謝喬。 – JAVAJoseph