黑马程序员技术交流社区

标题: 代码很少,但是搞不懂,请大神出手 [打印本页]

作者: Ak-47    时间: 2016-3-30 00:52
标题: 代码很少,但是搞不懂,请大神出手
public class Demo13 {
        public static void main(String[] args) {
                int i = 1 ;
                i = i++ ;
                System.out.println(i);
        }
}
这个i 的值是多少?为什么?我真是怕了啊{:2_31:}
作者: LLQALLQ    时间: 2016-3-30 00:55
结果是1。i先自增再自增
作者: 守徒徒    时间: 2016-3-30 01:16
怎么也想不通,我觉得是2啊、。?大家怎么想的???
作者: 腾龙3158    时间: 2016-3-30 01:53
i = 1;先赋值再自增!
作者: fea    时间: 2016-3-30 02:06
本帖最后由 fea 于 2016-3-30 02:19 编辑

输出的结果为1,但此时i也自增了,主要还是运算顺序的问题。把代码修改一下就不难理解,可以很清晰地看出来
  1. public class Demo {
  2.         public static void main(String[] args) {
  3.                 int i = 1 ;
  4.                 int n;
  5.                 n = i++ ;
  6.                 System.out.println(i);
  7.                 System.out.println(n);
  8.         }
  9. }
复制代码
如不理解,请看下面两个例子。
注意:++和--有前置和后置两种写法
1.若运算符是前置于变量的,则变量先加1(或减1),再参与表达式中的运算。示例代码请看例1。
2.若运算符是后置于变量的,则变量先参与表达式的运算,再加1(或减1)。示例代码请看例2。
3.(1)例1:++i是在整个表达式之前进行计算的
  1. class Demo1{
  2.         public static void main(String[] args){
  3.                 int i = 10;
  4.                 int n;
  5.                 n = 10 * ++i;  //先算i++即10+1等于11,再计算整个表达式10*++i,i的值为11,n的值为110
  6.                 System.out.println("i的值为:" + i);
  7.                 System.out.println("n的值为:" + n);
  8.         }
  9. }
复制代码
(2)例2:在这个例子中i++是在计算整个表达式(10*i++)后计算的
  1. class Demo2{
  2.         public static void main(String[] args){
  3.                 int i = 10;
  4.                 int n;
  5.                 n = 10 * i++;  //先算10*i即10*10等于100,再计算i++,i的值为11,n的值为100
  6.                 System.out.println("i的值为:" + i);
  7.                 System.out.println("n的值为:" + n);
  8.         }
  9. }
复制代码





作者: zhoubinjian    时间: 2016-3-30 02:20
结果是1,i=i+1,可以写为i=i,i=i+1,计算机底层的运算是从右往左的,也就是先赋值,此时i=1,接下来定义的int i=1,这个i再赋值一次,所以还是1
作者: 长衫造纸农_    时间: 2016-3-30 08:33
i++之后没有赋值,就是1,如果是++i就是2
作者: sbqtvb2007    时间: 2016-3-30 08:56
亲。i=1的。先出去玩,再回来吃饭哦。 而不是吃完饭再出去玩的。
作者: dmadboy    时间: 2016-3-30 09:17
  int i = 3;
      for(int j = 0; j < 5;j++){
       i=i++;
      }
      System.out.println(i);
这个理解了,基本上就明白了
作者: haitao    时间: 2016-3-30 09:50
就理解为先左赋值,后右自增。
作者: zhangchao555    时间: 2016-3-30 10:25
加法在前面和在后面是不一样的,在后面 是先给 I  赋值  所以结果是1
作者: onceIme    时间: 2016-3-30 15:22
i = i++; 可以分解成,i = i; i++,是先给一个i的内存空间时1,然后才执行++;所以i值就是1,就算多次循环都是一养的,你可以将前面和i和后面的i++看出是两个不同的变量;将这个变下,添加一个 int j;i = i++变成j = i++,然后你输出j和i,看下值就明白了,这种算是奇异的代码,最好少写
作者: 淡然无味    时间: 2016-3-30 15:28
i++是先赋值在自增的,先把 1 赋值给前面的 i ,然后再自增,所以输出的是1,你可以换成其他的变量观察
作者: maikly    时间: 2016-3-30 18:03
i=1;先赋值后自增1!
作者: 卢磊磊    时间: 2016-3-30 18:12
1            
作者: 霸道总裁爱村花    时间: 2016-3-30 18:44
个人觉得,这并不是两个变量,也不可以当作两个变量来理解。这个题在论坛上也出现很多次了,这涉及到内存分配的问题。i=i++在执行的时候会先开辟一个内存空间存储i的原值,然后i进行自增,最后再进行赋值,把原值赋给了自增后的i,所以i又变成了原来的值,所以无论自增多少次,最终i的值还是不变。i=i--也是这个执行过程
作者: daniua    时间: 2016-3-30 19:31
1,如果是++1就是2
作者: jiaojunwei    时间: 2016-3-30 19:46
++ 的运算等级比 = 高,先取 i 的值为 1 ,再 i 自增,此时 i == 2 ,再把取出来的 1 赋给 左边 ,此时 i == 1.
作者: zhuzhibo    时间: 2016-3-30 19:50
当然是1了。。
作者: wxf468907066    时间: 2016-3-30 20:45
不懂了....
作者: 小灰辉    时间: 2016-3-30 21:29
i=1;
首先 i = i++;   i++ = 1;i++把值赋给i  也就是i=1;
所以i的值是1;
作者: 晴苑    时间: 2016-3-30 22:00
结果为 i = 1;
作者: 马儿不吃草    时间: 2016-3-30 22:06
这个必须是1 呀
作者: 陌丶    时间: 2016-3-30 22:58
++在前是先自增后运算  ++在后是先运算再自增
作者: oassuperhan    时间: 2016-3-30 23:07
结果是1,因为i++操作会把值先保存在内存中,然后自加操作,再把操作前保存的值赋值给左面
作者: 兵蜂    时间: 2016-3-30 23:17
i=i++; 它的机制是 :
   int backup =i ;
       i = i+1 ;
       i = backup ;
                           
作者: lavenderlmm    时间: 2016-3-30 23:25
结果是1:++在参与混合运算时,如果++放在变量后面,则先参与运算后改变值,所以会把1先复制给变量i
作者: zapple926    时间: 2016-3-30 23:59
i =i++    是先在内存中开辟一块空间储存i的原值1,接着i自增变成2,再将内存中的i的值1赋值给i。所以无论如果++符号在后面无论运算多少次i的值不变。
作者: Ak-47    时间: 2016-3-31 01:27
看似很简单,其实涉及到很深啊{:2_32:}
作者: Poul    时间: 2016-3-31 10:23
i=i++相当于temp=i;i=i+1;i=temp;
去这个帖子看看http://bbs.itheima.com/thread-284605-1-1.html
作者: ruigao1993    时间: 2016-3-31 10:33
结果为1,,因为i=i++;  先使用i的值并赋值给了i=1,
作者: 695010894    时间: 2016-3-31 10:44
搞清楚  i++和++i就好了..............
作者: IT_china    时间: 2016-3-31 13:10
1,先把i赋值给i,然后i在自增1
作者: freshnboy    时间: 2016-3-31 15:22
这个题经典,顶一个
作者: 木丶子李    时间: 2016-3-31 15:38
1,从右往左,读作把i赋值给i,定义int i=1,再自增
作者: qq1091068107    时间: 2016-3-31 21:33
1啊,++在后边,就是先赋值   再自增
作者: xiening123    时间: 2016-3-31 21:38
加油吧 多敲代码~~~~~~~~~~
作者: 妄想年少轻狂    时间: 2016-3-31 22:10
我理解的是涉及两个知识点
1,++(后)先运算再自增
2,赋值运算符优先级最低
也就是说,i++先把i的值1取出做运算(把这个1即为a),然后i自增变成2
然后赋值,把a(值为1)赋给i
结果i=1
作者: 菜菜的小猪    时间: 2016-3-31 22:25
这个主要是i++ 与++i的区别 分清就好
作者: zq019633    时间: 2016-3-31 23:20
class Demo {
        public static void main(String[] args) {
                int i = 1 ;
                                int a1=1;        
                a1= i++ ;
                                 System.out.println(a1);
                System.out.println(i);
                               
                       
        }
}

作者: zq019633    时间: 2016-3-31 23:21
zq019633 发表于 2016-3-31 23:20
class Demo {
        public static void main(String[] args) {
                int i = 1 ;

输出结果 a1=1
i=2
作者: lmr1096200234    时间: 2016-3-31 23:38
++放后面 意思是 先赋值后自增  即输出i=1     ++放前面是先自增后赋值i=2




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