z-= - -y - x- -
今天在课堂上被一道题给“虐了”一小下,是关于java中运算符的题目,感觉很简单,但却失足。
所以要好好总结一下java中的自增和自减。
先看一下课堂上的这一道题目:z=3、x=1、y=2。问z-= --y - x--?
这道题楼主一眼看去,直接写出了 z=2。(说出来不嫌丢人,为了警醒自己!)答案其实为3。
我们先说一下前自增和后自增、前自减和后自减的区别。
自增(++):将变量的值加1,分前缀式(如++i)和后缀式(如i++)。前缀式是先加1再使用;后缀式是先使用再加1。
自减(--):将变量的值减1,分前缀式(如--i)和后缀式(如i--)。前缀式是先减1再使用;后缀式是先使用再减1。
我们分析一下上面那道题: 由题意可以变形为:z = z - ((--y) -(x--))
根据上面的分析:前缀式和后缀式的区别,这里的--y就是1,x--就是1,我们也就能得出z =3。
这里我们想要再输出一下 x 和 y 的值,相信很多人都会说 x=1;y=2;压根就没改变这两个数值,x和y不就是原本的数值么?
可是事实结果是 x = 0; y = 1;这里的 x = 0 也就意味着 在一开始的题目中,我们是先使用的x,然后再进行的--操作。
j = j++
public class Test{
public static void main(String[] args){
int j=0;
for (int i = 0; i < 100; i++){
j = j++;
}
System.out.println(j);
}
}
这道题,楼主第一眼过去,又是一眼看出了 j = 100 。可是答案却大出意料:j = 0;
我们分析一下上面的代码,如果这是一段c语言的代码,那这个 j 最终的数值就是100了,但是在java里,java编译器每次遇到自增自减的语句时,就会开辟一块新的内存空间来保存,然后再将这个换成变量的值赋给左边的变量,就像下面的代码:
temp = j;
j = j + 1;
j = temp;
所以最后的答案就是0;
我们再来看一下,如果换成 j = ++j;最后的j会是多少?流程应该如下:
temp = j +1;
j = j + 1;
j = temp;
这时候最后的结果应该就是100了。
所以再对自增、自减运算符的变量进行赋值时都需要特别注意。借用别人的一句话:“如果在程序中只输入i++就不会出现这个方面的问题,所以大家在以后的程序中如果使用到i=i++的时候要格外小心,一般只需要用i++就不会有问题了。”
解题技巧
对于以下,有int x = 5, y = 6, z;
题目1:z = ++x + y++;
题目2:z = ++x + x++;
题目3:x = ++x + x++;
对于上面的三道题目,我们下面一一解答。使用的技巧就是:把原始计算式转化成多个、有先后计算顺序的、小的计算式,然后带入变量的值,进行求解。记住:同一优先级的运算符的计算顺序是从右往左。
Q1:z = ++x + y++; 可以转化为:
x = x +1;
z = x + y;
y = y + 1;
带入x = 5, y = 6,可得x = 6; z = 12; y = 7;
Q2:z = ++x + x++; 可以转化为:
x = x +1;
z = x + x;
x = x + 1;
带入x = 5,可得x = 6; z = 6+6=12; x = 7; 故x=7,z=12;
Q3:x = ++x + x++; 可以转化为:
x = x +1;
x = x + x;
x = x + 1;
带入x = 5,可得x = 5+1=6; x = 6+6=12; x = 12+1=13; 故x=13。
???? j = i++ + i++
public static void main(String [] args){
int i = 0;
int j = i++ + i++; //这条语句等价于j = (i++) + (i++)
System.out.println("输出i的结果为"+i);
System.out.println("输出j的结果为"+j);
}
}
分析第一个(i++),假定 n=i++;
temp = n;
i = i+1;
n = temp;所以第一个(i++)==0;
第二个:因为是前缀式:(此时的i = 1)
所以最后的j = 1;
i自增了两次,所以 i = 2;