繁体   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