以前学艺不精,导致今天踏坑。
重点:
请注意这张图: 记住自增自减(++ --)的运算优先级高于赋值(=,-=…)符号
自增(++)和自减(–)的自我介绍
自增(++)和自减(–)属于java运算符中的算术运算符。
基本使用
++
运算,变量自己的值加1。反之,--
运算,变量自己的值减少1,用法与++
一致。
1.自增(++)
- 变量前
++
:例如++a
: 变量先自身加1,然后再将加1后的结果进行其他使用 。- 变量后
++
:例如a++
: 变量先加载到别的地方(可理解为 b = a),然后再自身加1,再把b进行运算 。
在前还是在后,决定了是先自增还是先加载
代码:
int i = 0;
// 单行使用时 i++;和++i没有区别
i++; // i 自身加1
System.out.println(i);//输出 i=1;
int j = 10;
int a = 0;
a = j++;
// 第一步 j先加载到别的地方( b=j=10 )
//因为 ++ 的优先级大于 = 优先级
// 第二步 j进行自加 (j = j + 1;) j = 11;
// 第三步 再把第一步加载起的j(这时应该说是b = 10;)赋值给 a = b = 10;
System.out.println(j+","+a);//输出 j=11,a=10;
int j = 10;
int a = 0;
a = ++j;
// 第一步 j先进行自加 (j = j + 1;) j = 11;
// 第二步 j在加载到别的地方( c=j=11 )
// 第三步 再把第二步加载起的j(这时应该说是b = 11;)赋值给 a = b = 11;
System.out.println(j+","+a);//输出 j=11,a=11;
今天的坑
int y = 1;
y = y++;
//分析:
//第一步 ++ 在变量后面 ,则先加载起变量(理解为 x = y = 1)
//因为 ++ 的优先级比 = 高。
//第二步 加载后 继续计算 ++ ,j = j+1; 这时(j=2)
//第三步 进行赋值操作 j = x = 1;
System.out.println(y); //输出 y = 1;
挖坑1
int i = 0;
i = i++ + (++i + i--);
System.out.println(i);// i = 4;
int j = 0;
j = j++ * (++j + j--);
System.out.println(j);// j = 0;
挖坑1——解析:
虽然() 的优先级高于 + 。但是并不是说,在等式中需要先计算括号内的,应该说是 括号内的计算是不可分割的。
在计算机的读取中,代码是从左向右进行读取的。
以 i = ①i++ + ②(③++i + ④i–); 为例
- 1.先读取到 ①i++ 把i加载起来(①=i=0),然后计算 ++ ——> i=i+1=1,这时i=1;
- 2.再读取②(③++i + ④i–),发现是个(),内部的计算不能分割。计算③++i + ④i–
- 3.③++i的 ++ 在变量i前面,则先计算 i = i + 1 = 2; 再加载 ③ = 2;
- 4.④i–的 – 再变量的后面,先加载 ④=i=2; 再计算i = i - 1 = 1;
- 5.可以计算出② = ③ + ④;
- 6.进行赋值 j = ① + ② = 4;