java中的自增(++)和自减(--)的总结

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;

你可能感兴趣的:(Java)