你真的懂 i++ 和 ++i 吗?

示例
// 示例1
int i = 1;
i = i++; 
System.out.println("i = " + i); 

// 示例2
int i = 1; 
int j = (2 * i++) + i;
System.out.println("j = " + j);

// 示例3
int i = 1; 
int j = i + (2 * i++);
System.out.println("j = " + j);

// 示例4
int i = 1;
int j = 1;
int k = i++ + ++i + ++j + j++; 
System.out.println("k = " + k);
答案
示例1:i = 1
示例2:j = 4
示例3:j = 3
示例4:k = 8
i++ 和 ++i 原理
  • i++ 即后加加,原理是:先自增,然后返回自增之前的值
  • ++i 即前加加,原理是:先自增,然后返回自增之后的值
  • 不论是前++还是后++,都有个共同点是先自增。
表达式原则

一个变量也是表达式,多个表达式的加减法运算都是从左到右进行的,当然乘除法的优先级还是大于加减法的。

答案详解
// 示例1 结果:i = 1
int i = 1;
i = i++; 
System.out.println("i = " + i); 

根据原理“先自增,然后返回自增之前的值”,i 自增后,i = 2,但是接着返回自增之前的值1,此时表达式变成 i = 1,1没有赋值给 i 时 i 的值是2,但是当把1赋值给 i 时,i 的值就又变成1了。

// 示例2 结果:j = 4
int i = 1; 
int j = (2 * i++) + i;
System.out.println("j = " + j);

根据表达式则,优先运算左边的表达式,即(2 * i++),i++后,i 的值为2,并返回自增之前的值1。
所以此时表达式为:int j = (2 * 1) + i;此时i的值已经是2了。
表达式又变为:int j = (2 * 1) + 2; 所以j = 4。

// 示例3 结果:j = 3
int i = 1; 
int j = i + (2 * i++);
System.out.println("j = " + j);

按一般人的想法是先算 2 * i++,i 先自增 i=2,然后返回自增之前的值1,所以此时表达式变为:int j = i + (2 * 1); 此时i的值为2了,表达式又变为:int j = 2 + (2 * 1);结果 j = 4,当然这答案是错误的。

根据一个变量也是表达式,多个表达式的加减法运算都是从左到右进行的原则。
int j = i + (2 * i++) 先算左边 i 这个表达式,表达式的结果为1。
所以表达式变成:j = 1 + (2 * i++)
然后 i 自增并返回自增之前的值1,所以表达式又变为:j = 1 + (2 * 1)
所以最后结果为3,此时i的值为2。

// 示例4 结果:k = 8
int i = 1;
int j = 1;
int k = i++ + ++i + ++j + j++; 
System.out.println("k = " + k);

先计算 i++,i++ 之后 i 的值为2,并返回自增之前的值1,所以整个表达式变为:1 + ++i + ++j + j++。此时的 i 值为2。
再计算 ++i,++i 之后 i 的值为3,并返回自增之后的值3,所以整个表达式变为:1 + 3 + ++j + j++。此时 i 的值为3。
再计算 ++j,++j 之后 j 的值为2,并返回自增之后的值2,所以整个表达式变为:1 + 3 + 2 + j++。此时 j 的值为2。
再计算 j++,j++之后 j 的值为3,并返回自增之前的值2,所以整个表达式变为:1 + 3 + 2 +2,即结果为8,此时j的值为3。

猜你喜欢

转载自blog.csdn.net/chenlixiao007/article/details/106045039