您当前的位置:首页 > 计算机 > 编程开发 > 编程箴言

i++ + i等于多少?关于i++以及++i的分析

时间:02-01来源:作者:点击数:

回顾错题,有一道题很有意思,值得研究一下:

下面的程序将来打印什么?()
public class TestIncr {
    public static void main(String args[]) {
        int i = 0;
        i = i++ + i;
        System.out.println("I =" +i);
    }
}

再看一道题,也是来自网络:

public class Q3 {
	public static void main(String[] args) {
		int i = 0, j = 0;
		int k = i+++i++;
		j = ++j+j++;
		int l = 0;
		l = l+++15+l++;
		System.out.println(i); 
		System.out.println(j); 
		System.out.println(k); 
		System.out.println(l); 
	}	
}

是不是感觉很变态,我刚开始看到的时候也觉得很扯淡,谁会这么写代码?我刚开始还以为编译不通过。但是,上面两段代码确实是可以通过编译,而且可以正确计算出结果。接下来我们先确定一下i++以及++i这两个具体的执行流程:

i++:先自增,再返回原来的值

int temp = i;
i = i + 1;
return i;

++i:直接+1返回

i = i + 1;
return i;

因此下面这段代码的打印值是:1 0 2 0

int i = 0;
int j  = 0;
int m = 0;
int k = 0;
j = i++;
m = ++i;
k = k++;
System.out.println(i);
System.out.println(j);
System.out.println(m);
System.out.println(k);

再看上面第一道题:打印结果是1。

下面的程序将来打印什么?()
public class TestIncr {
    public static void main(String args[]) {
        int i = 0;
        i = i++ + i;
        System.out.println("I =" +i);
    }
}

有的同学可能有疑问,不应该结果为0 吗?首先,我们要清楚一个计算规则:多个表达式的加减法运算都是从左到右进行的,每组表达式根据加减乘除的优先级判定。

比如:

int a = 1;
int b = a + 2*a++;

这就是三个表达式:a,a++,2*a++;计算顺序从左到右;计算结果为:1+2*2 = 5;

再比如:

int b = 2;
int c = b++ + 3 * b++;

这也是三个表达式:b++, b++, 3 * b++;计算结果为:2 + 3 * 3 = 8;

因此i=i++ + i;并不是计算完i++就直接返回的,后面要加一个i的值。这道题的计算流程为:

i = i++ + i;

i++ ===> int temp = i; i=i+1;return i;  i++这个表达式的结果为0,i的值为1;
i++ + i ===> 0 + 1 =1;结果为1;

再看第二道题:打印结果为2,2,1,16;

public class Q3 {
	public static void main(String[] args) {
		int i = 0, j = 0;
		int k = i+++i++;
		j = ++j+j++;
		int l = 0;
		l = l+++15+l++;
		System.out.println(i); 
		System.out.println(j); 
		System.out.println(k); 
		System.out.println(l); 
	}	
}


分析:
k = i++ + i++; 
第一个i++ ==> int temp = i; i=i+1; return temp;此时结果为0;i为1;
第二个i++ ==> int temp = i; i=i+1; return temp;此时结果为1;i为2;
二者相加:k = 0+1 =1

j = ++j + j++;
++j ==> j = j+1; return j; 此时结果为1,j为1;
j++ ==> int temp = j; j = j+1;return temp; 此时结果为1,j为2;
二者相加为1+1=2;j为2;

l = l++ + 15 + l++;
第一个l++ ===> int temp = l; l = l+1;return temp; 此时结果为0;l为1;
15常量,不计算
第二个l++ ===> int temp = l; l = l+1; return temp; 此时结果为1; l为2;
三者相加为 0 + 15 + 1 =16.结果为16。

如果看到这里你还是感觉有些不理解的话,可以参考这篇讲关于i++以及++i原理的文章:https://www.cdsy.xyz/computer/programme/java/230201/cd39973.html

方便获取更多学习、工作、生活信息请关注本站微信公众号城东书院 微信服务号城东书院 微信订阅号
推荐内容
相关内容
栏目更新
栏目热门