i++ 、 ++i和i+=1、i=i+1 的问题

逻辑运算中,关于i++ 、 ++i和i+=1、i=i+1 等这类问题是也笔试必考内容之一,基础中的基础。如果不会,那就已经可以看出你个人的基础水平了。虽然看上去简单,但是不懂原理是不行的。只有了解原理才能记忆最深

i++ 和 ++i 的区别:

i++:先赋值,在相加,
++i:先相加,在赋值

实战以下,看以下代码

  public class Test {
    	public static int print1() {
    	    int i = 0;
    	    i++;
    	    return i++;
    	}
    	public static int print2() {
    		int i = 0;
    		i++;
    		return ++i;
    	}
    	public static void main(String[] args) {
    		System.out.println(print1());
    		System.out.println(print2());
            int i=0;
    		System.out.println(i++);
            System.out.println(++i);
    	}
    }

执行结果为:1,2,0,2;
我们获取以下方法执行时的指令集

  public static int print1() {
        int i = 0;
        return i++;
    }
    public static int print2() {
        int i = 0;
        return ++i;
    }

查看汇编指令如下

在这里插入图片描述

public static int print1();
    Code:
       0: iconst_0		//将int类型常量0压入栈 
       1: istore_0		//将int类型值存入局部变量
       2: iload_0		//第一个int型局部变量进栈
       3: iinc          0, 1 	//把一个常量值加到一个int类型的局部变量上,0 表示局部变量索引
       6: ireturn		//将操作数栈栈顶的值返回个此方法的调用者
    LineNumberTable:
      line 5: 0
      line 6: 2

public static int print2();
    Code:
       0: iconst_0		//将int类型常量0压入栈 
       1: istore_0		//将int类型值存入局部变量
       2: iinc          0, 1 //把一个常量值加到一个int类型的局部变量上,0 表示局部变量索引
       5: iload_0		//第一个int型局部变量进栈
       6: ireturn	    //将操作数栈栈顶的值返回个此方法的调用者
    LineNumberTable:
      line 5: 0
      line 6: 2
  • iload_0 指将整型指存入操作数栈
  • iinc 用于实现局部变量的自增操作。在所有字节码指令中,只有该指令可直接用于操作局部变量。
  • ireturn 是将操作数栈栈顶的值返回个此方法的调用者

i=i++到底是怎么执行的

  public class Inc {  
        public static void main(String[] args) {  
           Inc inc = new Inc();  
           int i = 0;  
           inc.fermin(i);  
           i= i ++;  
           System.out.println(i); 
       
        }  
        void fermin(int i){  
           i++;  
        }  
    }  
    //答案是0; inc.fermin(i); 是一个干扰项,考值传递还是引用传递

i=i+1 和 i+=1 的区别

i+=1 会进行自动进行类型转换,相当于如下效果:

short i =1;
i=(short) (i+1);
  • 20
    点赞
  • 99
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值