在 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。

然后由于所有剩余的术语都是 post 修复版本,因此评估顺序将从右到左

a-- 将替换为 3,a 更改为 2。

b-- 将被替换为 5,b 变为 4。

a++将替换为2,a变为3。

所以最后的表达式应该是 2 * 5 / 3 + 5 等于 8 但输出中显示的答案是 7。谁能告诉我哪里错了。

System.out.println(a++ * b-- / a-- + ++b);

System.out.println(3 * 4 / 4 + 4);

你必须这样读: 每当您看到该变量时,它都会被 returned。 所以如果你有 a++,它会先 return 然后增加它。 如果你有++a,它会先递增它,然后return它。

首先,如果您有类似的东西:

A * B / C + D

根据 Java Language Spec, section 15.7, Evaluation order:

,表达式从左到右计算,因为没有优先级、括号或关联性覆盖该顺序

The Java programming language guarantees that the operands of operators appear to be evaluated in a specific evaluation order, namely, from left to right.

JLS section 15.7.3 可以覆盖 这个正常顺序:

The Java programming language respects the order of evaluation indicated explicitly by parentheses and implicitly by operator precedence.

但这里不是这样,因为除法和乘法的优先级高于加法,而且不涉及括号。

此外,15.7.1明确指出(我的重点):

The left-hand operand of a binary operator appears to be fully evaluated before any part of the right-hand operand is evaluated.

因此副作用属于子表达式求值,而不是整个表达式。这意味着,在类似 a * --a 的情况下, 不可能 a 的递减影响乘法的左侧,这已经被完全评估.

因此,在上面显示的表达式中,A * B / C + DD 实际上将被计算为 last 并且附加到它的任何副作用都不会发生在其他一切都已经被评估之前。此外,ABC 的计算所产生的任何副作用都将在 D 执行之前发生。

将该推理应用于您的副作用表达式,这实际上是:

(a++) * (b--) / (a--) + (++b)
  • 最初,a3b4
  • a++ 使用 3,将 a 设置为 4
  • b-- 使用 4,将 b 设置为 3
  • a-- 使用 4,将 a 设置为 3
  • ++bb 设置为 4,使用 4.

所以:

  3 * 4 / 4 + 4
=    12 / 4 + 4
=         3 + 4
=             7

你好,下面是"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

让我们把有关声明

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 +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);

您在声明中使用了以下运算符。运算符按其优先顺序列出。

  • post-递增,post-递减
  • 预增量
  • 乘法 (*, /, +, -)

所以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).

您可以查看与此相关的post。我参考过。 Link.