增量后(i+;+;)和增量前(i+;+;i)操作符在Java中如何工作?

增量后(i+;+;)和增量前(i+;+;i)操作符在Java中如何工作?,java,post-increment,pre-increment,Java,Post Increment,Pre Increment,你能给我解释一下这个Java代码的输出吗 int a=5,i; i=++a + ++a + a++; i=a++ + ++a + ++a; a=++a + ++a + a++; System.out.println(a); System.out.println(i); 在这两种情况下,在计算前,输出均为20。 a++计算a并将其递增 与您给出的表达式相关: i = ((++a) + (++a) + (a++)) == ((6) + (7) + (7)); // a is 8 at the

你能给我解释一下这个Java代码的输出吗

int a=5,i;

i=++a + ++a + a++;
i=a++ + ++a + ++a;
a=++a + ++a + a++;

System.out.println(a);
System.out.println(i);

在这两种情况下,在计算前,输出均为20。
a++
计算
a
并将其递增

与您给出的表达式相关:

i = ((++a) + (++a) + (a++)) == ((6) + (7) + (7)); // a is 8 at the end
i = ((a++) + (++a) + (++a)) == ((5) + (7) + (8)); // a is 8 at the end
我上面使用的parentese是Java隐式使用的。如果你用这种方式看这些术语,你可以很容易地看到,它们都是相同的,因为它们是可交换的

i = ++a + ++a + a++;

工作:增量a到6(当前值6)+增量a到7(当前值7)。总和是13,现在将其与a(=7)的当前值相加,然后将a增加到8。总和为20,赋值完成后a的值为8

i = a++ + ++a + ++a;

工作:a的起始值为5。在加法中使用它,然后将其增加到6(当前值6)。将a从当前值6递增到7,以获得另一个+操作数。总和为12,a的当前值为7。下一步将a从7增加到8(当前值=8),并将其与前一个和12相加,得到20

这有帮助吗

a = 5;
i=++a + ++a + a++; =>
i=6 + 7 + 7; (a=8)

a = 5;
i=a++ + ++a + ++a; =>
i=5 + 7 + 8; (a=8)
要点是
++a
增加值并立即返回


a++
也会增加值(在后台),但会返回变量的未更改值-看起来它是稍后执行的

a
为5时,则
a++
给表达式一个5,然后递增
a
,而
++/a
在将数字传递给表达式之前递增
a
(在这种情况下,给表达式一个
a
6)

那么你算

i = 6 + 7 + 7
i = 5 + 7 + 8

++a
递增,然后使用变量。
a++
使用变量,然后递增变量

如果你有

a = 1;
你呢

System.out.println(a++); //You will see 1

//Now a is 2

System.out.println(++a); //You will see 3
您的特定代码段。

在上面的示例中

int a = 5,i;

i=++a + ++a + a++;        //Ans: i = 6 + 7 + 7 = 20 then a = 8 

i=a++ + ++a + ++a;        //Ans: i = 8 + 10 + 11 = 29 then a = 11

a=++a + ++a + a++;        //Ans: a = 12 + 13 + 13 = 38

System.out.println(a);    //Ans: a = 38

System.out.println(i);    //Ans: i = 29

工作:前置/后置增量具有“从右到左”的关联性,并且前置优先于后置,因此首先前置增量将作为
(++a++a)=>7+6
进行求解。然后将
a=7
提供给post increment=>
7+6+7=20
a=8

a=5; i=a++ + ++a + ++a;


工作:前置/后置增量具有“从右到左”的关联性,并且前置优先于后置,因此首先将前置增量作为
(++a+++a)进行求解=>7+6
。然后提供
a=7
以进行增量后置=>
7+7+6=20
a=8
如果不在表达式中,则增量前和增量后是等效的

a=5; i=a++ + ++a + ++a;
int j =0;
int r=0         
for(int v = 0; v<10; ++v) { 
          ++r;
          j++;
          System.out.println(j+" "+r);
  }  
 1 1  
 2 2  
 3 3       
 4 4
 5 5
 6 6
 7 7
 8 8
 9 9
10 10
intj=0;
int r=0

对于(intv=0;v,我相信如果您将所有语句组合在一起并在Java8.1中运行它,您将得到不同的答案,至少我的经验是这样说的

代码的工作方式如下:

int a=5,i;

i=++a + ++a + a++;            /*a = 5;
                                i=++a + ++a + a++; =>
                                i=6 + 7 + 7; (a=8); i=20;*/

i=a++ + ++a + ++a;           /*a = 5;
                                i=a++ + ++a + ++a; =>
                                i=8 + 10 + 11; (a=11); i=29;*/

a=++a + ++a + a++;            /*a=5;
                                a=++a + ++a + a++; =>
                                a=12 + 13 + 13;  a=38;*/

System.out.println(a);        //output: 38
System.out.println(i);         //output: 29

++是前缀增量运算符:

  • 首先计算并存储结果
  • 然后使用变量
a++是后缀增量运算符:

  • 首先使用变量
  • 然后计算并存储结果

一旦你记住了规则,EZ会让你计算所有的事情!

假设你的意思是

int a=5; int i;

i=++a + ++a + a++;

System.out.println(i);

a=5;

i=a++ + ++a + ++a;

System.out.println(i);

a=5;

a=++a + ++a + a++;

System.out.println(a);
其结果是:

i = (6, a is now 6) + (7, a is now 7) + (7, a is now 8)
所以i是6+7+7=20,所以20被打印出来

i = (5, a is now 6) + (7, a is now 7) + (8, a is now 8)
所以我是5+7+8=20,所以20被再次打印

a = (6, a is now 6) + (7, a is now 7) + (7, a is now 8)

在计算完所有右侧后(包括将a设置为8),然后将a设置为6+7+7=20,因此最后一次打印20。

在这两种情况下,它首先计算值,但在增量后,它保留旧值,并在计算后返回值

++a

  • a=a+1
  • 返回a
  • a++

  • 温度=a
  • a=a+1
  • 返回温度

  • 我相信你执行这些陈述的方式不同
    一起执行将导致=>38,29

    int a=5,i;
    i=++a + ++a + a++;
    //this means i= 6+7+7=20 and when this result is stored in i,
    //then last *a* will be incremented <br>
    i=a++ + ++a + ++a;
    //this means i= 5+7+8=20 (this could be complicated, 
    //but its working like this),<br>
    a=++a + ++a + a++;
    //as a is 6+7+7=20 (this is incremented like this)
    
    inta=5,i;
    i=++a+++a+a++;
    //这意味着i=6+7+7=20,当该结果存储在i中时,
    //最后一个*a*将递增
    i=a++++++a++a; //这意味着i=5+7+8=20(这可能很复杂, //但它是这样工作的),
    a=++a+++a+a++; //当a为6+7+7=20时(按如下方式递增)
    递增前表示变量在表达式中求值之前递增。递增后表示变量在表达式中求值后递增


    因此,仔细观察,你会发现所有三个赋值都是算术等价的。

    总是避免歧义语句:)@ C++ Salurav不同于C和C++,java和C语言都有严格的定义的顺序,所以这些语句不含糊。我知道,但是这些语句不是(不能)。用于实际目的,因此必须避免。@PeteKirkham这已经过去六年了,但我仍然想指出,在这种情况下,“含糊不清”是含糊不清的——它可能意味着“编译器不知道放什么”,也可能意味着“程序员不知道它意味着什么”。你确定第二个中的a==9吗?I=++a++a++;=>i=7+8+5;(a=8)由于后增量具有最高优先级,首先执行一个++,复杂的例子容易解释。对于C和C++,这个答案是相同的吗?@丹尼斯<代码> B= A++<代码>导致<代码> B=1,A=2 < /代码>,然后<代码> C++B>代码>导致<代码> C=2,b=2
    @klaslindbkäck可交换意味着可以交换两个表达式,但仍然得到相同的结果。所以a++++++++a==++a+a++(5+7==6+6;a==7结尾)。这些语句从右到左或从左到右都有效?最清晰的答案这是一个让我明白的答案。。谢谢。这是最简洁的回答+1
    i = (6, a is now 6) + (7, a is now 7) + (7, a is now 8)
    
    i = (5, a is now 6) + (7, a is now 7) + (8, a is now 8)
    
    a = (6, a is now 6) + (7, a is now 7) + (7, a is now 8)
    
    int a=5,i;
    i=++a + ++a + a++;
    //this means i= 6+7+7=20 and when this result is stored in i,
    //then last *a* will be incremented <br>
    i=a++ + ++a + ++a;
    //this means i= 5+7+8=20 (this could be complicated, 
    //but its working like this),<br>
    a=++a + ++a + a++;
    //as a is 6+7+7=20 (this is incremented like this)