A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

public class Test {
        public static void main(String[] args) throws IOException{
                int a = 1;
                for (int i = 0; i < 100; i++) {
                        a = a++;
                }
                System.out.println(a);
        }
}
输出结果,并请详细解释原理!谢谢!

6 个回复

倒序浏览
本帖最后由 xu6148152 于 2014-1-17 22:15 编辑

碉堡了竟然是1.在网上搜了下资料,说是++操作比赋值操作先进行。因此a++的结果为1,并被用来计算,然后++,这个时候虽然是2但是并没有被用来计算,而是使用之前的1来进行赋值的。所以结果是1。
回复 使用道具 举报
代码运行结果为1
变量a初始化设定的是1,在for循环中,a = a++;  a=a++的运算过程是先将a的指赋予a!即先运行a=a,再自动加1,这里加1只是作为返回值出现,并没有赋给a
回复 使用道具 举报
结果为1,因为a++是先赋值后自增,所以最终打印的a为1,如果使用++a结果就为101,因为++a是先自增后赋值
回复 使用道具 举报
本帖最后由 xu6148152 于 2014-1-17 22:26 编辑
未来希望 发表于 2014-1-17 22:03
结果为1,因为a++是先赋值后自增,所以最终打印的a为1,如果使用++a结果就为101,因为++a是先自增后赋值 ...

是先自增,但是自增的结果并没有拿来赋值。而是使用自增前的值赋值。最后执行赋值,因此覆盖了。不知道有没有理解错啊。
可以看下这里的分析,有反汇编的代码。
http://www.ticmy.com/?p=43
回复 使用道具 举报
  1. package com.mth.test;
  2. /**
  3. *
  4. * @ClassName: Test
  5. * @Description: 测试变量a的值与a++操作
  6. * @author mth DL
  7. * @date 2014-1-17 下午10:51:49
  8. *
  9. */
  10. public class Test {
  11.         public static void main(String[] args) {
  12.                 int a = 1;
  13.                 int b = 0;
  14.                 for (int i = 0; i < 100; i++) {
  15.                         // 第一次进来 i=0
  16.                         b = a++; // 右边a=1先赋值给b 此时b=1 然后等式右边++操作,此时a为2 ; 但是这里并没有赋值给左边的b
  17.                                         // 而是执行下面的语句
  18.                         a = b;// a本来是2  但是 b=1 结果执行完之后a=1
  19.                 }
  20.                 System.out.println(a);
  21.         }
  22. }
复制代码
回复 使用道具 举报
100个数太长,以10个数为例:重要的是语句 a = a++;的理解,a++是自增运算的表示方式中的一种,还有一种是++a。
在语句a = a++中,先对对a进行赋值,再进行自增操作。a的初始值是1,赋值后值仍是1.
接着再进行自增运算,变为2,但是由于自增是后进行的,所以不能将2传给a。进行下次循环的
还是a等于1.
但如果变以a = ++a; 就是先自增再赋值,a的初始值为1,自增变为2,再赋给a,进行下次循环。

T.jpg (127.3 KB, 下载次数: 24)

a = a++;

a = a++;

T2.jpg (132.07 KB, 下载次数: 28)

T2.jpg
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马