我对前缀和后缀增量有点困惑。
我知道表达式是从右侧计算的,前缀有更高的优先级,即:
例子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 中工作?示例确实清除了一些混淆但不是全部
i = ++a + ++a + a++;
变成:
i = ((++a) + (++a)) + (a++);
(因为:优先规则;一元增量在二进制加法之前解析,二进制加法从左到右解析,所以给定X+Y+Z
,先计算X+Y
,然后计算that+Z
。
因此(a 从 0 开始):
++a
;该表达式的值为 1,作为副作用,a
现在为 1.++a
(第二个++a
);该表达式的值为 2,作为副作用,a
现在是 2.a++
- 该表达式的值为 2,作为副作用,a
现在是 3.i
是 5.很有道理,不是吗?
i=a + a++ + a;
变成:
i = (a + (a++)) + a;
出于同样的原因(首先是一元,然后是从左到右)。
a
,即0且无副作用a++
,它是 0,作为副作用,a
现在是 1.a
为1,没有副作用所以,a 是 1,i 是 1.
i=a + a++ + a++;
变成:
i = (a + (a++)) + (a++);
a
,即0且无副作用a++
,它是 0,作为副作用,a
现在是 1.a++
是 1,作为副作用,a
现在是 2.所以,a 是 2,i 是 1.
i=a++ + a++ + a++;
变成:
i = ((a++) + (a++)) + (a++);
a++
(第一个),这是0,作为副作用,a
现在是1.a++
(第二个),它是1,作为副作用,a
现在是2.a++
(第三个)是2,作为副作用,a
现在是3.所以,a 是 3,i 是 3.
我们看例子0我们可以推断
不会被执行a++
我不知道你是怎么推断出来的,但那是不正确的。当然是执行了。一般来说,'不在同一个表达式中执行'没有任何意义。你可能完全误解了这些是如何工作的/你把事情复杂化了。 Java很简单:
按照运算符优先级列表 - 从列表的顶部开始并找到使用这些运算符的所有操作。在这些操作周围添加括号,从左到右。完成后,转到列表中的下一批操作员,并执行完全相同的操作。继续前进,直到到达列表的末尾。瞧。现在一切都有括号,所以从左到右解决所有问题。