Java 后缀增量

问题描述 投票:0回答:1

我对前缀和后缀增量有点困惑。

我知道表达式是从右侧计算的,前缀有更高的优先级,即:

例子0

int i = 0; 
int a = 0;
i = ++a + ++a + a++;
System.out.println("i: "+i+" a:"+a);

在上面,jvm 将评估 (++a + ++a) 并将结果 a 传递给 (a)++ 但是 JVM 不会在此循环中递增 a。

所以输出将是 a:3 i: 5 的原因是 ((1+2) + 2) 在 i 的最终值为 5 并且 a 的值为 3.

我的困惑是我在做的时候

例一

int a=0,i = 0;
i=a + a++ + a;
System.out.println("a: "+a+" i: "+i);

例二 int a=0,i = 0; 我=一个+一个+++一个++; System.out.println("a: "+a+" i: "+i);`

示例 3

int a=0,i = 0;
i=a++ + a++ + a++;
System.out.println("a: "+a+" i: "+i);`

输出如下:

a: 1 i: 1
a: 2 i: 1
a: 3 i: 3

如果我们看一下示例 0,我们可以推断出 a++ 不会在与示例 1 中的 sout 相矛盾的相同表达式中执行,在示例 1 中,我期望 i 为 0,因为所有 a 均为 0,但它出现为 1.

如果我们假设 a++ 在同一个表达式中执行,那么为什么在“示例 2”中它没有显示至少 2,为什么它显示 1。

在示例 3 中,我假设它的某些计算方式为 (1+1+1) 如果是这种情况,那么示例 2 不应该像 (0+1+1)

有人可以解释一下吗?

已检查后增量(i++)和前增量(++i)运算符如何在 Java 中工作?示例确实清除了一些混淆但不是全部

java increment post-increment
1个回答
0
投票

例子0

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

变成:

i = ((++a) + (++a)) + (a++);
(因为:优先规则;一元增量在二进制加法之前解析,二进制加法从左到右解析,所以给定
X+Y+Z
,先计算
X+Y
,然后计算
that+Z

因此(a 从 0 开始):

  1. 首先,解决
    ++a
    ;该表达式的值为 1,作为副作用,
    a
    现在为 1.
  2. 然后eval
    ++a
    (第二个
    ++a
    );该表达式的值为 2,作为副作用,
    a
    现在是 2.
  3. 解决二进制加法; 1+2 是 3.
  4. 现在解析
    a++
    - 该表达式的值为 2,作为副作用,
    a
    现在是 3.
  5. 现在做加法:3+2 是 5。所以,
    i
    是 5.

很有道理,不是吗?

例一

i=a + a++ + a;

变成:

i = (a + (a++)) + a;
出于同样的原因(首先是一元,然后是从左到右)。

  1. 首先解决
    a
    ,即0且无副作用
  2. 接下来解析
    a++
    ,它是 0,作为副作用,
    a
    现在是 1.
  3. 算算 - 0+0 是.. 0.
  4. 解决
    a
    为1,没有副作用
  5. 做数学题 - 0+1 是 1.

所以,a 是 1,i 是 1.

例二

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

变成:

i = (a + (a++)) + (a++);

  1. 首先解决
    a
    ,即0且无副作用
  2. 接下来解析
    a++
    ,它是 0,作为副作用,
    a
    现在是 1.
  3. 算算 - 0+0 是.. 0.
  4. resolve
    a++
    是 1,作为副作用,
    a
    现在是 2.
  5. 做数学题 - 0+1 是 1.

所以,a 是 2,i 是 1.

示例 3

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

变成:

i = ((a++) + (a++)) + (a++);

  1. 首先解决
    a++
    (第一个),这是0,作为副作用,
    a
    现在是1.
  2. 下一步解决
    a++
    (第二个),它是1,作为副作用,
    a
    现在是2.
  3. 做数学 - 0+1 是 1.
  4. 解决
    a++
    (第三个)是2,作为副作用,
    a
    现在是3.
  5. 做数学题 - 1+2 是 3.

所以,a 是 3,i 是 3.

我们看例子0我们可以推断

a++
不会被执行

我不知道你是怎么推断出来的,但那是不正确的。当然是执行了。一般来说,'不在同一个表达式中执行'没有任何意义。你可能完全误解了这些是如何工作的/你把事情复杂化了。 Java很简单:

按照运算符优先级列表 - 从列表的顶部开始并找到使用这些运算符的所有操作。在这些操作周围添加括号,从左到右。完成后,转到列表中的下一批操作员,并执行完全相同的操作。继续前进,直到到达列表的末尾。瞧。现在一切都有括号,所以从左到右解决所有问题。

© www.soinside.com 2019 - 2024. All rights reserved.