黑马程序员技术交流社区

标题: 不理解打印的值为什么是3,大神解析下 [打印本页]

作者: 18566190744    时间: 2016-5-17 00:08
标题: 不理解打印的值为什么是3,大神解析下
class Demo
{
public static void main(String[] args)

        {
        int i = 3;               
      for(int j = 0; j < 5;j++)
        {
             i =i++;//在这里是怎么运算的,为什么没有i+1?
        }

      System.out.println(i);

作者: 不安分的程序猿    时间: 2016-5-17 00:56
  1. public static void main(String[] args)

  2.         {
  3.         int i = 3;                //定义一个变量 i=3
  4.       for(int j = 0; j < 5;j++)   //for循环  
  5.         {
  6.              i =i++;//  i=i++(先赋值在自增)  i = 3   i++ =4
  7.         }

  8.       System.out.println(i);
复制代码
//输出3   (如果是++i 第一个输出的就是4)
作者: 不安分的程序猿    时间: 2016-5-17 00:57
  1. public static void main(String[] args)

  2.         {
  3.         int i = 3;                //定义一个变量 i=3
  4.       for(int j = 0; j < 5;j++)   //for循环  
  5.         {
  6.              i =i++;//  i=i++(先赋值在自增)  i = 3   i++ =4
  7.         }

  8.       System.out.println(i);//输出3   (如果是++i 第一个输出的就是4)
  9. }
复制代码

作者: hycold    时间: 2016-5-17 01:43
一般都是i++;或者i=i+1;吧  虽然我也不知道为什么i=i++;即没有报错,i的值也没变
作者: 骄阳登峰    时间: 2016-5-17 06:46
本帖最后由 骄阳登峰 于 2016-5-17 07:23 编辑
hycold 发表于 2016-5-17 01:43
一般都是i++;或者i=i+1;吧  虽然我也不知道为什么i=i++;即没有报错,i的值也没变 ...

i=i++;这样写法是没有错误的,
作者: 骄阳登峰    时间: 2016-5-17 07:07
本帖最后由 骄阳登峰 于 2016-5-17 07:23 编辑

class Demo {
        public static void main(String[] args) {
                int i = 3;
                for (int j = 0; j < 5; j++) {
                        i = i++;
                        /*i=i++;在试行过程中如下:
                     int temp=i;//temp=3
                     i=i+1;//i=4
                     i=temp;//i=3

                      */
                }
                System.out.println(i);
        }
}

这个程序输出的i等于几?
答案是:3
解析:i++是一个表达式,是有返回值的,它的返回值就是i自加前的值
Java对自加是这样处理的:
首先把i的值(注意是值,不是引用)拷贝到一个临时变量区temp,然后对i变量加1,最后返回临时变量区temp的值。
程序第一次循环时的详细处理步骤如下:
步骤1 JVM把i值(其值是3)拷贝到临时变量区temp
步骤2 i值加1,这时候i的值是4
步骤3 返回临时变量区temp的值,注意这个值是3,没修改过。
步骤4 返回值赋值给i,此时i值被重置成3。

注意:        i=i++;在试行过程中如下:
        int temp=i;
        i=i+1;
        i=temp;



作者: 骄阳登峰    时间: 2016-5-17 07:15
这个问题的解决方法很简单,只要把 “i=i++”修改为“i++”即可。
每种语言对自增的实现方式各不同,该问题在于不同的语言环境有不同的实现:
C++中“i=i++”与“i++”是等效的,在Java和php中则是上述处理方式。
作者: 我是你岁哥❤环    时间: 2016-5-18 17:22
骄阳登峰 发表于 2016-5-17 07:07
class Demo {
        public static void main(String[] args) {
                int i = 3;

受教~\(≧▽≦)/~啦啦啦 谢谢
作者: yuanqingleivip    时间: 2016-5-18 20:20
i=i++;
是先完成3赋值给i,然后i再自增。
作者: tuan2016    时间: 2016-5-18 20:25
这个比较好……感谢分享




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