簡體   English   中英

在Java中使用增量和減量運算符造成混淆

[英]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 + DD實際上將最后被求值,並且附加到它的任何副作用都不會在其他所有值都被求值之前發生。 此外,在對D進行操作之前,會因ABC的評估而產生任何副作用。

將該推理應用於您的副作用表達,實際上是:

(a++) * (b--) / (a--) + (++b)
  • 最初, a3b4
  • a++使用3 ,將a設置為4
  • b--使用4 ,將b設置為3
  • a--使用4 ,將a設置為3
  • ++bb4 ,使用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM