黑马程序员技术交流社区

标题: 关于java自增自减和我想的不同 [打印本页]

作者: 不抛弃不放弃    时间: 2013-11-10 00:16
标题: 关于java自增自减和我想的不同
我对一段程序的结果很不理解,代码如下:

int a,c=1;
c=c++;
a=c;
System.out.println("a="+a+"c="+c);
结果为 a=1;c=1;
我的分析是这样的,各位看下是哪里分析错了;
先c=c++;由于++在后,先执行c=c;结果为c=1;然后c++;c结果为2,后边a=c,就是看上面的结果了。
我这样分析是哪里错了? 我找了半天就没弄明白,望各位讲解详细点。

作者: 零下五度的水    时间: 2013-11-10 00:32
运行符优先级的问题,等号(=)永远在最后,++的优先级其实很高
c=c++只是说 c++的值是c也就是1,然后c自增(这个时候c=2),然后c = 1又变回1了
作者: FFF    时间: 2013-11-10 00:41
本帖最后由 FFF 于 2013-11-10 12:47 编辑

c++,加加在后面,先赋值,再自增。永远等于1;c=1,c++,c=c,c=1;自增被覆盖。自增后又被赋值为c=1;自增无效。
  1.         public static void main(String[] args){
  2.                 int a,c=1;
  3.                 for(int x=0;x<10;x++){
  4.                 c=c++;
  5.                 //System.out.println("c="+a);
  6.                 a=c;
  7.                 System.out.println("a="+a+"c="+c);
  8.                 }
  9.         }
复制代码
从以上例子中,可以看出。无论自增多少次,你的c++都是无效的。
其实,你要自增,写个c++就可以了!为什么要写c=c++;?

作者: 中关村阿旺    时间: 2013-11-10 01:03
java中有一个中间缓存变量机制,c=c++;这句代码创建了1个临时的整型变量对象,存储自增运算的结果。
这句代码可以分解成如下操作:
注:temp代表java创建的那个临时的整型变量对象。
temp=c;
c=c+1;
c=temp;
所以,c=c+1;这句代码的结果被c=temp;这句代码覆盖了。
所以,结果仍是1。
平常情况下,如果想要让某一个变量自增,可以直接c++;或者++c;即可。
作者: 剑魂    时间: 2013-11-10 01:11
  1. public static void main(String[] args)
  2.         {
  3.                 int a=1,c=1;
  4.                 for(int x=0;x<10;x++){
  5.                 c=c++;
  6.                 a=c;
  7.                             }
  8.                 System.out.println("a="+a+"c="+c);
  9.         }
复制代码
修正下楼上大哥的代码,赋值和少了括号。
作者: hel    时间: 2013-11-10 02:28
同求解
作者: 黄炳期    时间: 2013-11-10 10:51
帖子已分类,若仍有疑惑,可重新提问~
作者: Shimano    时间: 2013-11-10 11:00
int a,c=1;
c = c++;                        //关键:"="前边的c=1,后边的“c++”中c=2,但都是暗涵的值,这是我的理解
a = c;
System.out.println("a="+a+"c="+c);
结果为 a=1;c=1;      为什么不是这种结果??

理解
        首先:说明你虽然知道运算符的优先级,但是没有弄明白,
        其次:搞编程的最忌讳就是想当然,要按照概念和标准一步一步来,记好是一步一步!

        即:c=c++;这个运算有如下步骤:
        第一步:先进行赋值,即:c = c;
        (此步骤没有实质含义,你若是看到b = c++;可能理解起来更好,c=c++;迷惑了你而已)

        第二步:变量c自身进行了一次+1运算,可以理解为如下几个步骤:
        c = c + 1;
        所以,把c的值赋给a后,运行结果是:a=1; c=1;
作者: 不抛弃不放弃    时间: 2013-11-10 12:19
零下五度的水 发表于 2013-11-10 00:32
运行符优先级的问题,等号(=)永远在最后,++的优先级其实很高
c=c++只是说 c++的值是c也就是1,然后c自增 ...

恩 你们说的 让我越来越理解自增自减怎么回事了
作者: 不抛弃不放弃    时间: 2013-11-10 12:22
中关村阿旺 发表于 2013-11-10 01:03
java中有一个中间缓存变量机制,c=c++;这句代码创建了1个临时的整型变量对象,存储自增运算的结果。
这句 ...

你回答的就是我最想要的   谢谢  也谢谢楼下和楼上的
作者: hurryup    时间: 2013-11-10 15:57
关于c=c++和c=c+1的疑问,运算的出不同的结果,前者都为1,后者都为2
我分析了一下,是不是前者是先赋值后自增,而后者是先加1后赋值啊?
作者: Mr.__ㄨīn    时间: 2013-11-10 16:33
关于c=c++; 要考虑到运行符优先级的问题。
第一步:先运算c++
第二步:赋值c=1
然后c才为2。
所以,运行结果是:a=1; c=1;




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2