黑马程序员技术交流社区

标题: 关于自增输出的问题 [打印本页]

作者: 吴刚    时间: 2012-11-11 01:28
标题: 关于自增输出的问题
本帖最后由 吴刚 于 2012-11-11 18:20 编辑
  1. public class Test01 {
  2.         public static void main(String[] args){
  3.                 int a = 1;
  4.                 a = a++;
  5.                 System.out.println(a);
  6.         }
  7. }
复制代码
我知道后自增,是先算表达式的值,然后就算a++,但是有些疑问,计算表达式的值的时候是a=1,接着还要计算a++,a就变为2了,可是为什么还是输出1了,难道是先执行输出语句的原因吗?谢谢了

作者: 种生祥    时间: 2012-11-11 01:37
int a = 1;
a = a++;//a++的值是1,再赋值给a,得到的a仍是1这里是把a++赋给a,不是把a赋给a

int a = 1;
a++;//这样你会得到2
作者: 李长波    时间: 2012-11-11 01:58
本帖最后由 李长波 于 2012-11-11 02:00 编辑

a = a++;
先计算右边的!右边的值是不变的!还是1,先进行赋值运算!所以右边的值是1 在把1赋给a,所以a=1
作者: 罗宝    时间: 2012-11-11 08:27
public class Test01 {

        public static void main(String[] args){

                int a = 1;
                //此时首先计算右边的表达式a++的值,然后将得到的值赋值给右边的变量a,
                //应为a++是后自加,所以此时a++的值仍然是1,将1赋值给a,所得到的结果
          //自然就是1
                a = a++;

                System.out.println(a);

        }

}

作者: 罗宝    时间: 2012-11-11 08:27
本帖最后由 罗宝 于 2012-11-11 08:35 编辑

网速不好,又重贴了!

public class Test01 {

        public static void main(String[] args){

                int a = 1;
                //此时首先计算右边的表达式a++的值,然后将得到的值赋值给右边的变量a,
                //应为a++是后自加,所以此时a++的值仍然是1,将1赋值给a,所得到的结果
               //自然就是1
//               a = a++;
               
              //如果使用下面这种情况就会打印出2
                a++;
                System.out.println(a);

        }

}

作者: 许坤    时间: 2012-11-11 09:22
int a = 1;
a =a++;
意思是先将i声明初始化为1(int a=1),然后将将a赋值为a(a=a++),这里的a自加,是先赋值,先把a的值赋给别人,自己再累加一次,所以最后输出的a自然还是最初始的a,即1;
这里如果改成
int a=1;
a++;
或是
int a=1;
a=++a;
输出的就是2了。
要注意的是赋值运算符和算数运算符的优先级的问题.赋值运算符高于算数运算符的,所以先执行.
作者: 折纸时代    时间: 2012-11-11 17:59

因为 ++a 和 a++ 是两种自加方法,有所不同..
++a 是先自加再参与运算 ;
a++ 是先参与运算在自加;
下面来解析下不同:

(1)  int a = 0 ;                                                                                                     |     (2) int c = 0;
      int b = ++a + ++a ;                                                                                   |           int d = c++ + ++c ;
      int b = (0+1) + (1+1) ;                                                                             |          int d = (0) + (1+1);
       int b = 3 ;                                                                                                     |           int d = 2;
第一个a++ 先自加 值为:1 第二个 a自加之前值已经为1 , 再自加为2     |       第一个c++是先运算再自加,值为0. 第二个++c
                                                                                                                             |          因为之前的c++,所以运算后赋值自身,所以++c值为2;

上面是变量名重复出现的问题解析

如果 int a = 0 ;
         a = a ++;
这个表达式的意思是  右边a 先赋值给左边的a ,所以直接输出a的值还是 0
如果 int a = 0;
         int b = a ++ ; 执行输出则a的值是1,b的值为0..



作者: 吴刚    时间: 2012-11-11 18:19
谢谢楼上几位
作者: z983546935    时间: 2012-11-11 18:40
李长波 发表于 2012-11-11 01:58
a = a++;
先计算右边的!右边的值是不变的!还是1,先进行赋值运算!所以右边的值是1 在把1赋给a,所以a=1 ...

你好像我们老师啊。 是不是牛哥?
作者: z983546935    时间: 2012-11-11 18:40
李长波 发表于 2012-11-11 01:58
a = a++;
先计算右边的!右边的值是不变的!还是1,先进行赋值运算!所以右边的值是1 在把1赋给a,所以a=1 ...

你好像我们老师啊。 是不是牛哥?
作者: 李长波    时间: 2012-11-11 19:05
z983546935 发表于 2012-11-11 18:40
你好像我们老师啊。 是不是牛哥?

哥哥做过j2ee!但想去北京有个更好的发发展!黑马的入学很严格!哥哥前两环节扣了1.5分了!
作者: z983546935    时间: 2012-11-11 20:09
去传智播客也行的啊!!!!!!!
作者: 朝花夕拾    时间: 2012-11-12 00:45
a++,是赋值后,自增,a是变成2了,但你打印的是 你赋值的那个a,自然就是1了,如果你赋值的时候重新定义一个变量,打印a的结果将会是2,如果++a,将会是自增后赋值,
作者: 黑马周磊    时间: 2012-11-12 11:09
a = a++;//优先级问题,先计算右边的a++,值是1,相当于是把表达式a++赋给了a;
作者: 黑马-小龙    时间: 2012-11-12 15:44
a = a++;//这是一个赋值运算,把右边的值赋给左边,a++是运算后的值,它在这没有进行运算所以它的值不变还是1,直接赋给了左边,所以输出还是1
作者: 崔雪    时间: 2012-11-12 16:29
本帖最后由 崔雪 于 2012-11-12 16:40 编辑

首先这个题,跟java的执行原理有关系。楼上几位说的都不太靠谱。。。

在main方法里,
1.压栈参数列表中的args为#0位置
2.压栈常量1进栈,该常量1当前在栈顶#2位置
3.弹栈栈顶常量1赋值给变量#1也就是a
4.压栈变量a的值1进栈到栈顶#2位置
5.将#1位置a的值加一(这时的a是2),#2位置栈顶的值(4中压栈进来的a)还是1
6.将栈顶#2位置的1弹栈并赋值给#1位置的a
7.打印#1位置a的值

以上是整个程序的字节码执行步骤,在java中所有的++,无论前后都是需要在赋值操作之前完成的,这里a实际上已经被++过变为2,但是由于赋值操作把1又赋值给a,所以覆盖了原来的2.

简单点说a = a++; 就是,先把a的“值” 1拿出来,然后a自增为2,在把这个1赋值给a,所以a是1,同时自增也不是没有进行,而且被最后的赋值操作覆盖了
作者: 7℃洋    时间: 2012-11-12 21:45
public class Test01 {

       public static void main(String[] args){

               int a = 1;

               a = a++;

               System.out.println(a);

        }

}

输出的值必定是2嘛!因为a = a++;
这句代码肯定是先将a的值赋给a,然后a自增1,这个时候a的值就是2了,然后才打印!
所以不管你的执行语句是a=a++;还是a=++a;
输出的结果都是2!
作者: 郑丹丹    时间: 2012-11-12 22:12
你要分清a++和++a的区别。
a++:是先赋值再计算;++a是先计算再赋值。而打印结果是a=1,因为a++是分两步完成的:赋值,打印;再自增。
作者: 程宏志    时间: 2012-11-12 22:17
关于自增自减的问题
int a = 3,b;
b = (a++)+(++a)*2+(a++)+(++a);
这道题的答案是25,
我总结了一点 :在自增或是自减运算中,你的记住一点那就是,++/--要是在变量的前面,那他们的运算就是,先进行自增或是自减,然后将得到的结果拿到运算中去计算。如果这些符号是在变量的后面,那么该变量就先把自身的值拿到运算中计算运算,然后在执行自增或是自减,接着把自增或是自减的值拿到下一步的运算中继续运算!




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