黑马程序员技术交流社区

标题: 为什么输出的是3 [打印本页]

作者: zybnqf520    时间: 2016-3-3 10:35
标题: 为什么输出的是3
public static void main(String[] args) {
      int i = 3;
      for(int j = 0; j < 5;j++){
         i = i++;
      }
      System.out.println(i);
}

作者: zybnqf520    时间: 2016-3-3 10:46
c语言输出的 却是8   是他们的运行机制 输出先后不同么。
作者: lixianglei    时间: 2016-3-3 11:35
public static void main(String[] args) {
      int i = 3;                                         // i已经被赋值为3  i = 3
      for(int j = 0; j < 5;j++){                // for 循环语句  j 没有赋值的变量  循环语句 输出 false  循环结束
         i = i++;
      }
      System.out.println(i);               //直接输出 int  i = 3
}
作者: dmadboy    时间: 2016-3-3 12:10
楼上的错了    首先建议楼主把i=i++中的i=去掉,再执行一次,就是8了,  至于为什么会出现i=3的情况,请看这个分析,很详细---http://blog.csdn.net/miderph84/article/details/3390166,怎么样  懂了吗?
作者: 胡萝卜骑士    时间: 2016-3-3 15:32
这样赋值还没试过呢~试试先
作者: 衙门口,门朝南    时间: 2016-3-3 16:32
这个问题好熟悉,但是我也不太明白
作者: 好大一只    时间: 2016-3-3 17:19
  i = i++;
这式子底层运行是这样的
先右边的i的值预存(用于参与其他运算),再进行+1运算,把结果赋值给右边的i,
最后,
再把预存的i的值赋值给左边的i
作者: 365708064    时间: 2016-3-3 18:05
好像j都没有定义和赋值初始化呢,应该是i++吧,应该考察的是i的循环结构!
作者: 超人d咖啡也加糖    时间: 2016-3-3 18:46
留名等答案
作者: sunnysun    时间: 2016-3-3 19:51
java和c的处理机制不同,java编译器在处理i++或i--的问题时,会分配一块内存空间存放初始值,循环结束后释放。i=i++在最后得到的仍然是i的初始值,为了得到 i 递增之后的值用i++即可。可以去网上查查,有详细的讲解。
作者: 陌城    时间: 2016-3-3 19:58
他们说的对
作者: cumtbao    时间: 2016-3-4 18:14
i=i++在for循环里有效,当for执行完毕后,就会消失,因为for循环限定了i=i++的生命周期。所以i其实没变化,i=3
作者: 执剑人    时间: 2016-3-4 18:36
留名等答案
作者: yehai    时间: 2016-3-9 22:12
这是后++,右边的i赋值给左边的i在自增
作者: xanx14710    时间: 2016-3-9 22:36
i=i++的执行顺序是i先自增1,然后再将自增之前的i赋值给自增之后的i,所以等于没变
作者: skykiah    时间: 2016-3-11 19:39
为什么是3呢
作者: gaoxuechao    时间: 2016-3-11 20:09
应该是7才对吧
作者: gaoxiang933    时间: 2016-3-11 20:18
因为i的值一直没有变化过!!!可以用debug运行查看
作者: 友人A    时间: 2016-3-11 20:58
看到上面的答案,表示还是很迷糊。求大神详解
作者: Man_hui    时间: 2016-3-11 21:06
如果你对于++运算比较理解的话  class Test {
        public static void main(String[] args) {
                int i = 3;
                i = i++;        //1 i结果为3
                i = i++;        //2  i结果为3
                i = i++;        //3  i结果为3
                i = i++;        //4  i结果为3
                i = i++;        //5  i结果为3
               
                System.out.println(i);   //最后结果还是为3
        }
}   
这样可能有利于你的理解
作者: luomoss    时间: 2016-3-11 22:03
i=i++在java里面无论运行多少次,i=i。
作者: jeremylee    时间: 2016-3-11 22:56
其实最简单的理解就是说for循环完后 里面的i的值就消失 所以i一直为3
作者: 大大阳    时间: 2016-3-11 22:57
用i=i++;头一次见这么写的 ,感觉好奇怪哦
作者: a302550641    时间: 2016-3-11 23:23
越看越迷茫了······
作者: 芸芸众生    时间: 2016-3-11 23:41
我真的没看懂i=i++是什么意思。。
作者: 翔骋丨灬公爵    时间: 2016-3-11 23:54
jeremylee 发表于 2016-3-11 22:56
其实最简单的理解就是说for循环完后 里面的i的值就消失 所以i一直为3

{:2_33:}你确定 你学会了?
虽然说是for 里面的值会被释放,但是也要看 值在哪里定义的

你说里面的值会消失,那你把楼主的i++ 变成 ++i 看看i会不会有变化

所以 不是for释放不释放的问题,问题是 ++在变量哪边的问题
作者: 翔骋丨灬公爵    时间: 2016-3-11 23:56
楼主 看看这段文字能看懂吗?

算术运算符++和--
      * a:单独使用:
                * 放在操作数的前面和后面效果一样。(这种用法是我们比较常见的)
        * b:参与运算使用:
                * 放在操作数的前面,先自增或者自减,然后再参与运算。
                * 放在操作数的后面,先参与运算,再自增或者自减。

作者: 翔骋丨灬公爵    时间: 2016-3-12 00:04
lixianglei 发表于 2016-3-3 11:35
public static void main(String[] args) {
      int i = 3;                                         // ...

j = 0  这就是在赋值啊,只不过赋值是0
a:执行初始化语句
        * b:执行判断条件语句,看其返回值是true还是false
                * 如果是true,就继续执行
                * 如果是false,就结束循环
        * c:执行循环体语句;
        * d:执行循环后的操作表达式
        * e:回到B继续。

很显然 j = 0 是小于5的
执行一次循环体,然后j++  j变成1 然后还是小于5
再执行循环体 然后 j++   j变成2 还是小于5
再执行循环体 然后 j++   j变成3 还是小于5
再执行循环体 然后 j++   j变成5 还是小于5
再执行循环体 然后 j++   j变成5 不小于5
循环结束

至于 为什么i还是等于1
因为又边的 i 先赋值给左边的i  并没有自身+1 所以i还是3
作者: 叫我高祥小朋友    时间: 2016-3-12 00:13
i++是没有变得,但i是变了的
作者: 奋飞的小模糊    时间: 2016-3-12 00:17
天天就是这个题,没意思
i =i++; i++先变成4,后++,把操作之前的值赋给i,i还是3,不断地赋值为3
完了
作者: 哦哈哟    时间: 2016-3-12 03:46
是i = i++这个运算的先后顺便不同。首先对于i++:本来的含义就是i自增后再赋值在自己也就是i=i+1。但是到了i = i++,在这个语句中,则是先运算i++得自增的i,然后全局的i赋值到自增的i里面。
作者: 暴风城管    时间: 2016-3-12 07:32
xanx14710 发表于 2016-3-9 22:36
i=i  的执行顺序是i先自增1,然后再将自增之前的i赋值给自增之后的i,所以等于没变 ...

对,顶一个
作者: oassuperhan    时间: 2016-3-12 12:40
i=i++;是将i的值加1然后将之前的值传给i,所以i的值没有变化
作者: 278008379    时间: 2016-3-12 13:16
哪有你们说的那么复杂,都不用看循环里的i是几,只看一点,输出语句在for循环外,循环内的值无论是多少,出了循环就释放了,输出的是第一次声明的值




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