关注我们,设为星标,每天7:30不见不散,每日java干货分享

技术解析

  • • ++i (前缀自增): 先自增,后使用。

    • • 先将i的值加1,然后返回自增后的值

  • • i++ (后缀自增): 先使用,后自增。

    • • 先返回i的原始值,然后再将i的值加1。

重要说明:如果++ii++独立成行的语句,那么它们的效果完全一样,都是将i的值加1。它们的区别只在当它们作为表达式的一部分时才会体现出来。

int i = 5;
i++; // i 变成了 6
int j = 5;
++j; // j 变成了 6
// 在这种情况下,i 和 j 的最终结果完全相同。

代码示例:在表达式中的差异

这个例子将清晰地展示它们作为表达式返回值时的根本不同。

public class IncrementDemo {

    public static void main(String[] args) {
        
        System.out.println("--- 1. 演示 ++i (前缀自增:先加后用) ---");
        int i_prefix = 5;
        System.out.println("原始 i 的值: " + i_prefix);
        
        // 这里的 ++i_prefix 是一个表达式
        // 1. i_prefix 先自增,变为 6
        // 2. 然后返回自增后的值 6,并赋值给 j_prefix
        int j_prefix = ++i_prefix;
        
        System.out.println("j = ++i 之后的结果:");
        System.out.println("   i 的值: " + i_prefix); // 输出 6
        System.out.println("   j 的值: " + j_prefix); // 输出 6


        System.out.println("\n" + "---".repeat(20) + "\n");


        System.out.println("--- 2. 演示 i++ (后缀自增:先用后加) ---");
        int i_postfix = 5;
        System.out.println("原始 i 的值: " + i_postfix);

        // 这里的 i_postfix++ 也是一个表达式
        // 1. 先返回 i_postfix 的原始值 5,并赋值给 j_postfix
        // 2. 然后 i_postfix 再自增,变为 6
        int j_postfix = i_postfix++;

        System.out.println("j = i++ 之后的结果:");
        System.out.println("   i 的值: " + i_postfix); // 输出 6
        System.out.println("   j 的值: " + j_postfix); // 输出 5
    }
}

字节码层面

从JVM字节码层面看,它们的区别更明显:

  • • ++i: 主要使用iinc指令,直接在局部变量表上完成自增。

  • • i++: 会先用iload指令将变量的原始值加载到操作数栈,然后再用iinc指令对局部变量表中的变量进行自增。后续的操作使用的是栈上那个原始值


故事场景:魔法ATM机的存款服务

  • • 你的银行账户 (变量 i): 里面有5个金币。

  • • 你要办理的业务: 存入1个金币,并打印一张显示“本次操作业务值”的回执。

  • • ATM的回执 (表达式的返回值): 你拿到手里的那张纸。

模式一:++i — “专业模式:先办业务,再打回执”

这是一种严谨、账目优先的服务模式。

  • • 你的操作:
    你在ATM机上选择了“前缀自增 (++i)”服务。

  • • ATM的工作流程:

  1. 1. 先存款 (先自增): ATM的机械臂先把你的1个金币投进了金库。你的账户余额立刻从5个金币变成了6个

  2. 2. 再打印 (后使用): 然后,机械臂查询了你当前最新的余额(6个金币),并为你打印了一张回执,上面写着:“业务值:6”。

Logo

这里是“一人公司”的成长家园。我们提供从产品曝光、技术变现到法律财税的全栈内容,并连接云服务、办公空间等稀缺资源,助你专注创造,无忧运营。

更多推荐