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++”,千万不要鄙视他,记住,能够以不同的语言解释清楚这句话的人绝对不简单,应该表现出“如滔滔江水”般的敬仰,心理默念着“高人,绝世高人哪”。

原文地址:https://www.cnblogs.com/liyuspace/p/8424593.html

时间: 2024-08-02 08:26:06

java自增运算的相关文章

Java语法基础--运算

常量是一些不变的数据,我们用变量的方式把常量给记录下来,变量是内存中一个空间,空间中可以存储某些类型的数据,变量还有一个好处,就是可以给一些常量取名称,方便阅读: 取模运算 就是取余数.模2运算,非0即1,用于切换. -3%6结果是-3 . 3%-6结果是3 . 负数运算参考左边符号. 对于除号"/",它的整数除和小数除是有区别的:整数之间做除法时,只保留整数部分而舍弃小数部分. 例如:int x=3510;x=x/1000*1000;  x的结果是3. 自增运算 ++ int a=3

Java学习:运算、运算符、操作数、表达式

运算:对常量和变量进行操作的过程称为运算. 操作数:参与运算的常量或者变量称为操作数. 运算符:对常量和变量进行操作的符号称为运算符. 算术运算符:+.-.*./.%.++.-- /和%的区别? /:除法,得到商 符号相同为正,不同为负 %:除法,得到余数 符号和第一个操作数相同 %的应用: x%3 等于 0 说明x能被3整除 x%2 等1 说明x是奇数  等0 说明x是偶数 ++,--运算符 作用:++就是加1,--就是减1. 自增自减运算符 ++,--在运算的时候,可以放在操作数的前面,也可

hdu4927 Series 1(组合+公式 Java大数高精度运算)

题目链接: Series 1 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others) Total Submission(s): 423    Accepted Submission(s): 146 Problem Description Let A be an integral series {A1, A2, . . . , An}. The zero-order series o

java中变量运算细节 (2)

/* 目的:测试变量的运算方式 结果:byte a, b, c; a = b+c; 或者 a = b+10 形如这种形式的算式, 等式的右边的运算结果默认的都是int型的!因为等式右边有变量, 编译器无法确定变量的内容 ,因为它是变量!所以相加之后得到的int再默认强制转换成byte可能会损失精度. 而形如 a=4+5:这种常量的赋值,虽然 4 和 5 都默认的是int, 但都是常量,它们的值是确定的!所以如果 4+5的值超过了 byte的最大值的范围, 那就会编译出错!(也就是等式右边都是常量

编程题:自增运算与自减运算的运用

#include<stdio.h> void main() {int a1,a2,a3,a4,b1,b2,b3,b4; a1=a2=a3=a4=10; b1=(a1++)+(a1++)+(a1++); b2=(++a2)+(++a2)+(++a2); b3=(a3--)+(a3--)+(a3--); b4=(--a4)+(--a4)+(--a4); printf("a1=%d,a2=%d,b1=%d,b2=%d\n",a1,a2,b1,b2); printf("a

Java MVC 增删改查 实例

需求:增加新部门的功能,对应数据库表示Oracle的dept表 一.Java MVC 增 实现: 1.视图层(V):注册部门 deptUpdate.jsp 2.控制层(C): 3.模型层(M): 二.Java MVC 删 三.Java MVC 改 四.Java MVC 查 全部代码如下: 主页面:index.jsp <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncod

Java自增原子性问题(测试Volatile、AtomicInteger)

这是美团一面面试官的一个问题,后来发现这是一道面试常见题,怪自己没有准备充分:i++;在多线程环境下是否存在问题?当时回答存在,接着问,那怎么解决?...好吧,我说加锁或者synchronized同步方法.接着问,那有没有更好的方法? 经过一番百度.谷歌,还可以用AtomicInteger这个类,这个类提供了自增.自减等方法(如i++或++i都可以实现),这些方法都是线程安全的. 一.补充概念 1.什么是线程安全性? <Java Concurrency in Practice>中有提到:当多个

Swift自增和自增运算

1 自增和自增运算 2 3 和 C 语言一样,Swift 也提供了方便对变量本身加1或减1的自增(++)和自减(--)的运算符.其操作对象可以是整形和浮点型. ‌ 4 var i = 0 5 ++i // 现在 i = 1 6 每调用一次++i,i的值就会加1.实际上,++i是i = i + 1的简写,而--i是i = i - 1的简写. 7 8 ++和--既是前置又是后置运算.++i,i++,--i和i--都是有效的写法. 9 10 我们需要注意的是这些运算符修改了i后有一个返回值.如果你只想

自增运算深入

++a=8:++a可以当做左值使用,a++=8:错误 不可以当做左值使用 #include <stdio.h> void main()  /*主函数*/ { int a,b,c,d;  a=5; b=5;  c=(a++)+(a++)+(a++);  d=(++b)+(++b)+(++b);  printf("a=%d,b=%d,c=%d,d=%d\n",a,b,c,d); } 结果是什么? 而后Eric搜了一下后发现,类似的问题很多,也就是说对自增自减运算符感到迷惑是一个