首页 > 解决方案 > 递增和递减运算符工作逻辑

问题描述

我知道如果将运算符放在操作数之前,称为前置递增运算符和前置递减运算符,则首先应用运算符,返回值是表达式的新值。

或者,如果运算符放在操作数之后,称为后自增运算符和后减运算符,则返回表达式的原始值,在返回值后应用运算符。

但我不明白下面的代码输出。

//CODE FRAGMENT A

int value1 = 3;
int value2 = ++value1 * 5 / value1-- + --value1;
//  value2 =  4 * 5 / value1-- + --value1;
//  value2 =  4 * 5 / 4 + --value1;
//  value2 =  4 * 5 / 4 + 2;
//  value2 =  20 / 4 + 2;
//  value2 =  5 + 2;
//  value2 = 7;

// CODE FRAGMENT B

int var1 = 10;
var1 = var1++ + var1 + var1-- - var1-- + ++var1;
// var1 = 10  + 11   +  11    -  10    +  10;
// var1 = 32

// CODE FRAGMENT C

int var2 = 5;
var2 += var2 + var2 + ++var2; 
// var2 = var2 + var2 + var2 + ++var2;
// var2 =  5   +  5   +  5   +   6;
// var2 = 10 + 5 + 6;
// var2 = 15 + 6;
// var2 = 21;

我知道最高优先级运算符后一元运算符和前一元运算符,但我不了解“代码片段 B 和代码片段 C”的情况。为什么这种情况不评价如下?

// CODE FRAGMENT B
int var1 = 10;
var1 = var1++ + var1 + var1-- - var1-- + ++var1;
// var1 = 10  + var1 +  11    -  10     +  10
// var1 = 10  +  10  +  11    -  10     +  10
// var1 = 20  + 11 - 10 + 10
// var1 = 31 -10 + 10
// var1 = 21 + 10
// var1 = 31

// CODE FRAGMENT C
int var2 = 5;
var2 += var2 + var2 + ++var2; 
// var2 = var2 + var2 + var2 + ++var2;
// var2 = var2 + var2 + var2 +  6;
// var2 =  6   +  6   +  6   +  6;
// var2 = 12 + 6 + 6;
// var2 = 18 + 6;
// var2 = 24;

标签: java

解决方案


这是代码片段 B 的逻辑,var1在括号中显示了更新后的值。

int var1 = 10;
var1 = var1++ + var1 + var1-- - var1-- + ++var1;
       var1++ = 10  (var1 = 11)
var1 =   10   + var1 + var1-- - var1-- + ++var1;
                var1 = 11  (var1 = 11)
var1 =   10   +  11  + var1-- - var1-- + ++var1;
var1 =       21      + var1-- - var1-- + ++var1;
                       var1-- = 11  (var1 = 10)
var1 =       21      +   11   - var1-- + ++var1;
var1 =             32         - var1-- + ++var1;
                                var1-- = 10  (var1 = 9)
var1 =             32         -   10   + ++var1;
var1 =                 22              + ++var1;
                                         ++var1 = 10  (var1 = 10)
var1 =                 22              +   10  ;
var1 =                    32                   ;
32  (var1 = 32);

推荐阅读