对于 ++i 和 i++,许多人可能都知道,不就是先加1再取值,和先取值再加1嘛。然而,真的是这样吗?请先看如下4道题,能所有答对能够忽略这篇文章。java
题目code
// 示例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);
先别着急着看答案,先本身思考下,解出本身的答案,而后再往下翻查看答案是否与你的一致。blog
答案数学
示例1:i = 1 示例2:j = 4 示例3:j = 3 示例4:k = 8
你是否发现有些答案和你想的不同,若是我告诉你 ++i 和 i++ 其实都是先计算加1,你是否是更懵逼了!再详解答案以前,先了解两个知识点。class
1 i++ 和 ++i 原理变量
i++
:先自增,再返回自增以前的值++i
:先自增,再返回自增以后的值先自增
。2 表达式原则原理
一个变量也是表达式,多个表达式的加减法运算都是从左到右进行的,固然乘除法的优先级仍是大于加减法的。im
答案详解img
// 示例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了。
di
// 示例2 结果:j = 4 int i = 1; int j = (2 * i++) + i; System.out.println("j = " + j);
根据表达式原则,一个变量也是表达式,多个表达式的加减法运算都是从左到右进行的
// 示例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,然而这答案是错误的。正确逻辑以下:
根据表达式原则,一个变量也是表达式,多个表达式的加减法运算都是从左到右进行的
。
// 示例4 结果:k = 8 int i = 1; int j = 1; int k = i++ + ++i + ++j + j++; System.out.println("k = " + k);