你真的懂 i++ 和 ++i 吗?
发布日期:2021-06-30 12:36:53
浏览次数:3
分类:技术文章
本文共 1840 字,大约阅读时间需要 6 分钟。
对于 ++i 和 i++,许多人可能都知道,不就是先加1再取值,和先取值再加1嘛。然而,真的是这样吗?请先看以下4道题,能全部答对可以忽略这篇文章。
题目
// 示例1int i = 1;i = i++; System.out.println("i = " + i); // 示例2int i = 1; int j = (2 * i++) + i;System.out.println("j = " + j);// 示例3int i = 1; int j = i + (2 * i++);System.out.println("j = " + j);// 示例4int i = 1;int j = 1;int k = i++ + ++i + ++j + j++; System.out.println("k = " + k);
先别着急看答案,先自己思考下,解出自己的答案,然后再往下翻查看答案是否与你的一致。
答案
示例1:i = 1示例2:j = 4示例3:j = 3示例4:k = 8
你是否发现有些答案和你想的不一样,如果我告诉你 ++i 和 i++ 其实都是先计算加1,你是不是更懵逼了!在详解答案之前,先了解两个知识点。
1 i++ 和 ++i 原理
i++
:先自增,再返回自增之前的值++i
:先自增,再返回自增之后的值- 不论是前++还是后++,它们的共同点就是
先自增
。
2 表达式原则
一个变量也是表达式,多个表达式的加减法运算都是从左到右进行的,当然乘除法的优先级还是大于加减法的。
答案详解
// 示例1 结果:i = 1int i = 1;i = i++; System.out.println("i = " + i);
根据原理,先自增,再返回自增之前的值
,i 自增后,i = 2,然后返回自增之前的值1,此时表达式变成 i = 1,1没赋值给 i 时 i 的值是2,但最后把1赋值给 i 时,i 的值就又变成1了。
// 示例2 结果:j = 4int i = 1; int j = (2 * i++) + i;System.out.println("j = " + j);
根据表达式原则,一个变量也是表达式,多个表达式的加减法运算都是从左到右进行的
- 优先运算左边的表达式,即(2 * i++),i++后,i 的值为2,并返回自增之前的值1
- 此时表达式为 int j = (2 * 1) + i ,i 的值已经是2了
- 最后表达式变为 int j = (2 * 1) + 2 ,于是 j = 4。
// 示例3 结果:j = 3int i = 1; int j = i + (2 * i++);System.out.println("j = " + j);
按数学思维,我们可能会先计算 2 * i++ 部分,i 先自增 i = 2,然后返回自增之前的值1,此时表达式变为 int j = i + (2 * 1) 。此时 i 的值为2了,故表达式又变为 int j = 2 + (2 * 1) ,结果 j = 4,然而这答案是错误的。正确逻辑如下:
根据表达式原则,一个变量也是表达式,多个表达式的加减法运算都是从左到右进行的
。
- int j = i + (2 * i++) 先算 + 号左边 i 这个表达式,表达式的结果为1
- 表达式变为 j = 1 + (2 * i++)
- 再计算 + 号右边的表达式,然后 i 自增并返回自增之前的值1,表达式又变为 j = 1 + (2 * 1)
- 最终结果为 j = 3,此时 i 的值为2
// 示例4 结果:k = 8int i = 1;int j = 1;int k = i++ + ++i + ++j + j++; System.out.println("k = " + k);
- 先计算 i++,i++ 之后 i 的值为2,并返回自增之前的值1,表达式变为 1 + ++i + ++j + j++。此时的 i 值为2
- 再计算 ++i,++i 之后 i 的值为3,并返回自增之后的值3,表达式变为 1 + 3 + ++j + j++。此时 i 的值为3
- 再计算 ++j,++j 之后 j 的值为2,并返回自增之后的值2,表达式变为 1 + 3 + 2 + j++。此时 j 的值为2
- 再计算 j++,j++之后 j 的值为3,并返回自增之前的值2,表达式变为 1 + 3 + 2 +2,即结果为8,此时j的值为3
转载地址:https://javalib.blog.csdn.net/article/details/106045039 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
哈哈,博客排版真的漂亮呢~
[***.90.31.176]2024年04月28日 12时04分08秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
SpringBoot整合Redis事务
2019-05-01
项目整合一级缓存和二级缓存
2019-05-01
自定义注解和aop抽取重复代码
2019-05-01
互联网API开放平台安全设计-基于OAuth2.0协议方式
2019-05-01
URL特殊字符转码
2019-05-01
为什么接口需要加密传输
2019-05-01
对称加密整个过程
2019-05-01
java内存模型
2019-05-01
volatile关键字
2019-05-01
HTTP_概述
2019-05-01
web相关概念回顾
2019-05-01
web服务器软件_概述
2019-05-01
tomcat_安装&卸载&启动
2019-05-01
tomcat_启动问题分析
2019-05-01
tomcat_关闭
2019-05-01
tomcat_部署项目的方式
2019-05-01
tomcat_动态java项目的目录结构
2019-05-01
Servlet_概述
2019-05-01
Servlet_快速入门
2019-05-01
Servlet_执行原理
2021-07-04