【转】Java的++自增
记得大学刚开始学C语言时,老师就说:自增有两种形式,分别是i++和++i,i++表示的是先赋值后加1,++i是先加1后赋值,这样理解了很多年也没出现问题,直到遇到如下代码,我才怀疑我的理解是不是错了:
public class Client
{
public static void main(String[] args)
{
int count =0;
for(int i=0;i<10;i++)
{
count=count++;
}
System.out.println("count="+count);
}
}
这个程序输出的count等于几?是count自加10次吗?答案等于10?可以非常肯定地告诉你,答案错误!运行结果是count等于0。为什么呢? count++是一个表达式,是有返回值的,它的返回值就是count自加前的值,Java对自加是这样处理的:首先把count的值(注意是值,不是引用)拷贝到一个临时变量区,然后对count变量加1,最后返回临时变量区的值。程序第一次循环时的详细处理步骤如下:步骤1 JVM把count值(其值是0)拷贝到临时变量区。步骤2 count值加1,这时候count的值是1。步骤3 返回临时变量区的值,注意这个值是0,没修改过。步骤4 返回值赋值给count,此时count值被重置成0。
“countcount=count++”这条语句可以按照如下代码来理解:
public static int mockAdd(int count)
{
//先保存初始值
int temp =count;
//做自增操作
countcount = count+1;
//返回原始值
return temp;
}
于是第一次循环后count的值还是0,其他9次的循环也是一样的,最终你会发现count的值始终没有改变,仍然保持着最初的状态。 此例中代码作者的本意是希望count自增,所以想当然地认为赋值给自身就成了,不曾想掉到Java自增的陷阱中了。解决方法很简单,只要把 “count=count++”修改为“count++”即可。该问题在不同的语言环境有不同的实现: C++中“count=count++”与“count++”是等效的,而在PHP中则保持着与Java相同的处理方式。每种语言对自增的实现方式各不 同,读者有兴趣可以多找几种语言测试一下,思考一下原理。 下次如果看到某人T恤上印着“i=i++”,千万不要鄙视他,记住,能够以不同的语言解释清楚这句话的人绝对不简单,应该表现出“如滔滔江水”般的敬仰,心理默念着“高人,绝世高人哪”。
- 推荐文章
- 懂了!国际算法体系对称算法DES原理
- SpringBoot启动原理
- hystrix线程池隔离的原理与验证
- windows环境下搭建kafka
- css: Web Open Font Format
- 自定义应用层通信协议
- 网络编程字节序转换问题
- C++通过JsonCpp读取Json文件
- Tensorflow踩坑系列---TFRECORD文件读写
- Tensorflow踩坑系列---数据读取文件队列
- Tensorflow踩坑系列---softmax_cross_entropy_with_logits
- Tensorflow踩坑系列---argmax中axis问题
- Tensorflow踩坑系列---池化层的padding="SAME"问题
- CNN实现验证码识别
- ORACLE锁的几种模式
- sqlite3 查看表结构
- count(1) count(*)
- SQLite 事务
- sqlite3数据库最大可以是多大?可以存放多少数据?读写性能怎么样?
- SVN常用命令
- 读懂diff
- Sqlite数据库的加密
- SQLite 数据类型
- SQLite 混合模式程序集是针对“v2.0.50727”版的运行时生成的,在没有配置其他信息的情况下,无法在 4.0 运行时中加载该程序集。
- datatable写入sqlite
- 使用NSSM将exe封装为服务
- Java OPC client开发踩坑记
- 最终解决:win10小娜无法使用(win10 win+q 无法搜索应用程序)
- OPC DA 客户端实例[.net]
- KepServer作为OPC UA服务器以及建立OPC UA客户端