i=5; j=i++; 之后,i和j分别是多少?90%的人会答错一个
在绝大多数情况下,为了代码的清晰和可维护性,强烈建议将自增操作作为一条独立的语句来编写(是合法的,但这往往会降低代码的可读性,并可能在复杂表达式中引入难以发现的Bug。的余额(5个金币),立刻为你打印了一张回执,上面写着:“的余额(6个金币),并为你打印了一张回执,上面写着:“指令将变量的原始值加载到操作数栈,然后再用。这是一种“客户优先”、先给凭证的服务模式。— “便捷模式:先给回执,再办业务”
关注我们,设为星标,每天7:30不见不散,每日java干货分享

技术解析
-
•
++i(前缀自增): 先自增,后使用。 -
-
• 先将
i的值加1,然后返回自增后的值。
-
-
•
i++(后缀自增): 先使用,后自增。 -
-
• 先返回
i的原始值,然后再将i的值加1。
-
重要说明:如果++i或i++是独立成行的语句,那么它们的效果完全一样,都是将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. 先存款 (先自增): ATM的机械臂先把你的1个金币投进了金库。你的账户余额立刻从5个金币变成了6个。
-
2. 再打印 (后使用): 然后,机械臂查询了你当前最新的余额(6个金币),并为你打印了一张回执,上面写着:“业务值:6”。
-
• 最终结果:
你的账户(i)里有6个金币,你手里的回执(j)上也写着6。 -
模式二:
i++— “便捷模式:先给回执,再办业务”这是一种“客户优先”、先给凭证的服务模式。
-
• 你的操作:
你在ATM机上选择了“后缀自增 (i++)”服务。 -
• ATM的工作流程:
-
1. 先打印 (先使用): ATM的机械臂先看了一眼你当前的余额(5个金币),立刻为你打印了一张回执,上面写着:“业务值:5”,并先把这张回执交给了你。
-
2. 再存款 (后自增): 在你拿到回执之后,机械臂才不慌不忙地把你的1个金币投进金库。你的账户余额变成了6个。
-
-
• 最终结果:
你手里的回执(j)上写着5,但你账户(i)的实际余额已经变成了6个金币。 -
故事总结:
操作
++i(先加后用)i++(先用后加)核心区别 表达式返回新值
表达式返回旧值
ATM比喻 先存款,再按新余额打回执 先按旧余额打回执,再存款 变量 i的变化无论哪种,
i的最终值都增加了1无论哪种,
i的最终值都增加了1一句话总结 我看重的是结果。 我看重的是过程的开始。 最佳实践建议:
虽然在表达式中使用++i和i++是合法的,但这往往会降低代码的可读性,并可能在复杂表达式中引入难以发现的Bug。在绝大多数情况下,为了代码的清晰和可维护性,强烈建议将自增操作作为一条独立的语句来编写(
i++;),而不是将其嵌入到复杂的表达式中。推荐阅读 点击标题可跳转
50个Java代码示例:全面掌握Lambda表达式与Stream API
16 个 Java 代码“痛点”大改造:“一般写法” VS “高级写法”终极对决,看完代码质量飙升!
为什么大佬的代码中几乎看不到 if-else,因为他们都用这个...
还在 Service 里疯狂注入其他 Service?你早就该用 Spring 的事件机制了
看完本文有收获?请转发分享给更多人
关注「java干货」加星标,提升java技能

❤️给个「推荐 」,是最大的支持❤️
更多推荐



所有评论(0)