[英]Confusion using Increment and decrement operators in Java
我有一個帶有增量和減量運算符以及一些二進制運算符的表達式。
public class precedence {
public static void main(String ar[]){
int a=3;
int b=4;
System.out.println(a++ * b-- / a-- + ++b);
System.out.println(a+","+b);
}
}
首先++ b替換為5,b將變為5。
然后,由於所有其余術語均為修訂后版本,因此評估順序為從右到左
將a--替換為3,並將a更改為2。
b--將被5代替,b變為4。
a ++將替換為2,而a變為3。
因此,最終表達式應為2 * 5/3 + 5,等於8,但輸出中顯示的答案是7。有人可以告訴我我錯了嗎。
首先,如果您有以下內容:
A * B / C + D
根據Java Language Spec, section 15.7, Evaluation order
該表達式從左到右進行評估,因為沒有優先級,括號或關聯性會覆蓋該順序。
Java編程語言保證運算符的操作數似乎按照特定的評估順序(即從左到右)進行評估。
JLS section 15.7.3
可以覆蓋此正常順序:
Java編程語言遵守括號中顯式表示的評估順序,並且運算符優先級隱式表示評估順序。
但這不是事實,因為除法和乘法的優先級高於加法,並且不包含括號。
另外,15.7.1明確指出(我強調):
在評估右側操作數的任何部分之前,似乎已對二進制運算符的左側操作數進行了完全評估。
因此,副作用屬於子表達式評估, 而不是整個表達式。 這意味着,在a * --a
之類的值中,減小a
不可能影響已經被充分評估的乘法的左側。
因此,在上面顯示的表達式中, A * B / C + D
, D
實際上將最后被求值,並且附加到它的任何副作用都不會在其他所有值都被求值之前發生。 此外,在對D
進行操作之前,會因A
, B
或C
的評估而產生任何副作用。
將該推理應用於您的副作用表達,實際上是:
(a++) * (b--) / (a--) + (++b)
a
是3
, b
是4
。 a++
使用3
,將a
設置為4
。 b--
使用4
,將b
設置為3
。 a--
使用4
,將a
設置為3
。 ++b
組b
至4
,使用4
。 所以:
3 * 4 / 4 + 4
= 12 / 4 + 4
= 3 + 4
= 7
讓我們關注有關聲明
int a=3; int b=4;
System.out.println(a++ * b-- / a-- + ++b);
步驟1: (
a++
* b-- / a-- + ++b)
至(
3
* b-- / a-- + ++b)
a=4,b=4
步驟2: (a++ *
b--
/ a-- + ++b)
至(3 *
4
/ a-- + ++b)
a=4,b=3
步驟3: (a++ * b-- /
a--
+ ++b)
至(3 * 4 /
4
+ ++b)
a=3,b=3
步驟4: (a++ * b-- / a-- +
++b
)
到(3 * 4 / 4 +
(a++ * b-- / a-- +
(3 * 4 / 4 +
4
)
a=3,b=4
所以最終的表達式是(3 * 4 / 4 + 4)
希望這可以澄清:)
int a=3;
int b=4;
System.out.println(a++ * b-- / a-- + ++b);
System.out.println(a+","+b);
您在語句中使用以下運算符。 運算符按其優先順序列出。
因此a++
(3, a=4)
, b--
(4, b=3)
和a--
(4, a=3)
將按照從左到右的順序執行。 然后將執行++b
(4, b=4)
。 現在, 乘法運算符將按從左到右的順序執行。 因此(3 * 4/4 + 4)。
(3 * 4 / 4 + 4) ==> (12 / 4 + 4) ==> (3 + 4) ==> 7
因此輸出為:7 。
最終值a = 3和b = 4 。
編輯:在評論中提問。
a=3,b=4;
expression : ++b * --a + ++b;
++b
(5)
,-- --a
(2)
和++b
(6)
將按從左到右的順序執行。
現在表達式是(5 * 2 + 6)
==> (10 + 6)
==> (16)
。
您可以檢查與此相關的帖子。 我已經引用了。 鏈接 。
System.out.println(a++ * b-- / a-- + ++b);
System.out.println(3 * 4 / 4 + 4);
您必須像這樣閱讀它:每當看到變量時,它都會被返回。 因此,如果您有a++
,它將首先返回它,然后遞增它。 如果您使用++a
,它將首先對其進行遞增,然后將其返回。
嗨,它遵循“ bodmas”
B支架優先
O階(即冪和平方根等)
DM除法和乘法(從左到右)
AS加減法(從左到右)
int a=3;
int b=4;
System.out.println(a++ * b-- / a-- + ++b);
a++ * b-- / a-- + ++b
3*(4/4) +4
3*1 +4
3 +4
a ++ * b-- / a-- + ++ b = 3 * 4/4 + 4
現在應用DMAS規則,因此3 * 1 + 4 = 3 + 4 = 7
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.