2011-06-16 39 views
8

我從Java官方教程閱讀前綴和後綴++ - 有不同的優先級:優先++和 - 運算符在Java中

後綴:EXPR ++ expr--

一元:++ expr --expr + expr -expr〜!

Operators

根據教程,不應該這

d = 1; System.out.println(d++ + ++d);

打印出圖6(d++使得d 2,++d使得3)代替4-?

我知道++d說明中被事先評估,但如果d++具有更高的優先級,然後++d,爲什麼不是d++首先被評估?更何況d++應該表明它具有更高的優先級?

編輯:

我試過如下:

d = 1; System.out.println(++d * d++);

它返回4.看來,它應該是2 * 2,而不是1 * 3。

+3

類似這樣的問題讓我很巨大。沒有人*曾經*寫過像'System.out.println(d ++ + ++ d)這樣的代碼;'爲什麼你在意?它是一個超級平凡。 – Qwerky 2011-06-16 15:11:03

+1

@Qwerky儘管沒有人會寫這樣的代碼,但也許是爲了上學。教師/教授喜歡問這樣的「它永遠不會寫成這樣,但我們總是在考慮你,看看你是否理解它是如何工作」的問題。 – 2011-06-16 15:14:24

+0

@Qwerky對不起,讓你沮喪:)至於我之所以問,也許是因爲好奇。因爲我不是貓,所以很幸運。 – 2011-06-16 15:14:39

回答

12

中的println語句的內部是該操作 (d ++)+(++ d)

  1. 據如下,d的值被讀取(d = 1)
  2. 電流值將d(1)的值加入加法函數
  3. d的值增加(d = 2)。

  4. 然後,在右側,d的值被讀出(2)

  5. d的值被遞增(現在d = 3)
  6. 最後,d的值(3)放入另外的功能在4

編輯

因此1分+ 3的結果:遺憾的格式,我很壞在使用列表哈哈

+0

謝謝你是第一個回覆和啓迪我!但是,我今天用盡了最大upvote,所以我想我明天就得做。 :) – 2011-06-16 15:08:24

10

關鍵是操作返回的內容。

  • x ++更改x的值,但 返回舊的x。
  • ++ x更改x的值,並返回新值。
 
d=1 
System.out.println(d++ + ++d); // d is 1 
System.out.println(1 + ++d); // d is 2 
System.out.println(1 + 3); // d is 3 

打印4

2

這不是優先級,它是關於評價順序。 d++評估爲1,但d遞增。 ++d增量d,然後計算結果爲3。

+0

我明白了。但是,你能告訴我一個案例,其中的優先級顯示? – 2011-06-16 15:07:01

+0

@Ziyao:在例如表達'(3 - 4 * 5)',優先級決定了這相當於'(3 - (4 * 5))','未((3 - 4)* 5)' 。 – 2011-06-16 15:09:33

0

d的值爲1

d ++被評估;它的值是1並且d現在是2(在++之後返回增量前的值)

++ d被評估;它的值是3和d是現在3(++增量後預返回值)

1 + 3 = 4

0

的System.out.println(d ++ + ++ d);

下面是如何不言而喻:執行

++ d,所以d現在是2

d + d被執行時,其等於4

值4被提供給系統

d ++執行.out.println(),所以現在d爲3

2

Why is this Java operator precedence being ignored here?

歸結爲後綴運算符首先被計算,但返回變量的原始值,如設計。因此,爲您的操作而言:

(d++ + ++d) 

Processes as: 
1. d++ evaluates, returning the original value of 1 but incrementing d to 2 
2. ++d evaluates, incrementing the value of 2 TO 3, and returning 3 
3. + evaluates, resulting in 1 + 3 

的困惑是不優先的順序進行評估的標記,你說對了。真正的問題在於理解後綴和前綴運算符之間的功能差異。

6

不同的優先順序並不意味着會先評估

這意味着表達式將以這種方式分組

在這種情況下,將d++ + ++d被分組(d++) + (++d),並且此二進制表達式將按照該順序進行評估:

  • 左操作數d++。該子表達式由一個後綴增量運算和可變的,所以它在這些兩個方面的影響:
    • 子表達式的值是1
    • 變量被更新:d = 2
  • 右操作數++d。該子表達式由前綴增量操作和可變的,所以它有這兩個作用:
    • 變量被更新:d = 3
    • 子表達式的值是3
  • 運營商+進行評估,使用兩個操作數的值。
    • 因此表達式值爲1 + 3 = 4

++的前綴和後綴形式之間的不同的優先級將僅在++d++中可以看出,這將被解釋爲++(d++) - 這沒有任何意義((++d)++有沒有人,要麼),因爲++只適用於變量,而不是值(和結果是數值)。

+1

關閉,但你的結論是不正確的。它應該是1 + 3 = 4,如上面的答案中所解釋的。 ++ d返回結果的增量之前,所以雖然d將等於2左側表達式求值之後,左表達式評估爲1。 – 2012-04-17 02:47:33

+0

感謝您的校正...奇怪的是,這得到了unnoted 9個月。 – 2012-04-17 07:32:03

+0

不客氣!我認爲在這裏以多種不同的方式解釋這一點很有價值,我想很多人會發現你提供的信息是有幫助的。 – 2012-04-17 07:47:20

0

我通過從頂部..According所有的解釋下面的代碼應該給11.0則y它給去理解10.0 雙X = 4.5; x = x + ++ x; // x獲得值10.0。