Java 为什么结果不是1?

Java 为什么结果不是1?,java,Java,打印到0 但是我认为m将被后加,最后是1。 请有人解释一下 注意:我知道增量后的工作原理(至少我认为我知道:p)。但我想弄明白的是,当我说m+=m++时,让我们假设它的意思是m=m+m++,它将在发送m的值后计算m++,在这种情况下,0,然后计算到m=0+0,然后由于后增量,增加m的值。现在,如果发生了后期增量,为什么m不是1m++返回m,然后将其增量 将其更改为++m,您将看到1 为了清楚起见,这个问题也解释了它:m++返回m,然后递增它 将其更改为++m,您将看到1 为了清楚起见,这个问题也

打印到
0
但是我认为
m
将被后加,最后是
1
。 请有人解释一下


注意:我知道增量后的工作原理(至少我认为我知道:p)。但我想弄明白的是,当我说
m+=m++
时,让我们假设它的意思是
m=m+m++
,它将在发送
m
的值后计算
m++
,在这种情况下,
0
,然后计算到
m=0+0
,然后由于后增量,增加
m
的值。现在,如果发生了后期增量,为什么
m
不是
1
m++
返回
m
,然后将其增量

将其更改为
++m
,您将看到
1


为了清楚起见,这个问题也解释了它:

m++
返回
m
,然后递增它

将其更改为
++m
,您将看到
1


为了清楚起见,这个问题也解释了这一点:

嗯,m++在增加它之前返回m的值,与++m相反,增量然后返回,如:

int m = 0;

m += m++;

System.out.println(m);

m++在增加之前返回m的值,与+m相反,增加后返回,如:

int m = 0;

m += m++;

System.out.println(m);
此时m为
0

int m = 0
扩展到
m=m+(m++)

m
返回
0

int m = 0
m++
返回m的值,即
0
,然后将其递增到
1

m+(m++)
转换为
0+0
(此时m是
1
a)

然后将其分配给
m
,得到
m
的最终值

提示:否则,在触摸该值时,请避免后增量

此时m为
0

int m = 0
扩展到
m=m+(m++)

m
返回
0

int m = 0
m++
返回m的值,即
0
,然后将其递增到
1

m+(m++)
转换为
0+0
(此时m是
1
a)

然后将其分配给
m
,得到
m
的最终值


提示:在触摸该值时避免后增量,否则请考虑以下规则:

  • a+=b
    相当于
    a=a+b
    。因此
    m+=m++
    相当于
    m=m+m++

    您可以看到,在右视野中第一次出现的
    m
    在增量之前进行评估,并生成
    0

  • int m = 0
    
  • m++
    递增
    m
    并返回递增前
    m
    的原始值。
    因此,在您的例子中,
    m++
    m
    设置为
    1
    并返回
    0

  • int m = 0
    
  • 赋值发生在右侧评估之后,而增量后发生在右侧评估期间

现在您可以看到表达式的计算方式如下:

  • 对右侧的求值产生
    0
    并将
    m
    设置为
    1

  • 赋值将
    m
    设置为右侧的值(
    0


    • 考虑以下规则:

      • a+=b
        相当于
        a=a+b
        。因此
        m+=m++
        相当于
        m=m+m++

        您可以看到,在右视野中第一次出现的
        m
        在增量之前进行评估,并生成
        0

      • int m = 0
        
      • m++
        递增
        m
        并返回递增前
        m
        的原始值。
        因此,在您的例子中,
        m++
        m
        设置为
        1
        并返回
        0

      • int m = 0
        
      • 赋值发生在右侧评估之后,而增量后发生在右侧评估期间

      现在您可以看到表达式的计算方式如下:

      • 对右侧的求值产生
        0
        并将
        m
        设置为
        1

      • 赋值将
        m
        设置为右侧的值(
        0


      事件的顺序是:

    • 对RHS进行评估(0)
    • 完成后增量(m++)
    • 计算结果被赋值(再次m=0)
    • i、 e.这相当于:

      m += m++;
      
      如果执行m=++m,则顺序为:

    • 预增量已完成(++m)
    • 对RHS进行评估(1)
    • 分配评估结果(m=1)

    • 事件的顺序是:

    • 对RHS进行评估(0)
    • 完成后增量(m++)
    • 计算结果被赋值(再次m=0)
    • i、 e.这相当于:

      m += m++;
      
      如果执行m=++m,则顺序为:

    • 预增量已完成(++m)
    • 对RHS进行评估(1)
    • 分配评估结果(m=1)

    • f
      是您的代码
      g
      是一个扩展版本,显示了它们都打印
      0
      的原因

      tmp = m;
      m++;
      m = tmp;
      

      f
      是您的代码
      g
      是一个扩展版本,显示了它们都打印
      0
      的原因

      tmp = m;
      m++;
      m = tmp;
      
      在代码中

      m++=m++结果-->>M值+(后增量M值(M++))

      最初

      m值=0

      在代码中,后增量(m++)m值=0(前增量(+m)=1)

      m++=m++结果-->>M值+(后增量M值(M++))

      最初

      m值=0


      递增后(m++)m值=0(递增前(++m)=1)回答:作业在执行作业之前评估副作用

      class Test {
          private static void f() {
              int x = 0;
              x += x++;
              System.out.println(x);
          }
      
          private static void g() {
              int x = 0;
              int preInc = x; // preInc = 0
              x += 1;         // x = 1
              x = preInc;     // x = 0
              System.out.println(x);
          }
      
          public static void main(String[] args) {
              f();
              g();
          }
      }
      
      相当于

      m += m++;
      

      回答:作业在执行作业之前评估副作用

      class Test {
          private static void f() {
              int x = 0;
              x += x++;
              System.out.println(x);
          }
      
          private static void g() {
              int x = 0;
              int preInc = x; // preInc = 0
              x += 1;         // x = 1
              x = preInc;     // x = 0
              System.out.println(x);
          }
      
          public static void main(String[] args) {
              f();
              g();
          }
      }
      
      相当于

      m += m++;
      

      OP表示打印到
      0
      @蒂科吉